BOJ/문자열 (해시,맵)

[C/C++] 백준 - 1283번 : 단축키 지정

JWonK 2022. 6. 22. 18:27
728x90
반응형

https://www.acmicpc.net/problem/1283

 

1283번: 단축키 지정

첫째 줄에 옵션의 개수 N(1 ≤ N ≤ 30)이 주어진다. 둘째 줄부터 N+1번째 줄까지 각 줄에 옵션을 나타내는 문자열이 입력되는데 하나의 옵션은 5개 이하의 단어로 표현되며, 각 단어 역시 10개 이하

www.acmicpc.net

문제

한글 프로그램의 메뉴에는 총 N개의 옵션이 있다. 각 옵션들은 한 개 또는 여러 개의 단어로 옵션의 기능을 설명하여 놓았다. 그리고 우리는 위에서부터 차례대로 각 옵션에 단축키를 의미하는 대표 알파벳을 지정하기로 하였다. 단축키를 지정하는 법은 아래의 순서를 따른다.

  1. 먼저 하나의 옵션에 대해 왼쪽에서부터 오른쪽 순서로 단어의 첫 글자가 이미 단축키로 지정되었는지 살펴본다. 만약 단축키로 아직 지정이 안 되어있다면 그 알파벳을 단축키로 지정한다.
  2. 만약 모든 단어의 첫 글자가 이미 지정이 되어있다면 왼쪽에서부터 차례대로 알파벳을 보면서 단축키로 지정 안 된 것이 있다면 단축키로 지정한다.
  3. 어떠한 것도 단축키로 지정할 수 없다면 그냥 놔두며 대소문자를 구분치 않는다.
  4. 위의 규칙을 첫 번째 옵션부터 N번째 옵션까지 차례대로 적용한다.

문제 지문에 나와있는 단축키 지정하는 법을 순서에 따라 모두 수행해주면 된다.

 

가장 먼저 각 단어의 첫 글자가 이미 지정되어있는지 확인을 하고 지정되어있지 않은 알파벳이라면 지정하면 된다.

이미 지정된 알파벳인지 아닌지 확인하는 방법은 알파벳 개수에 맞는 배열을 선언한 후 true / false로 관리해주었다.

->  isFirstWordKey() 함수로 구현해주었다.

 

* 대소문자 구분이 없기 때문에 아스키코드로 변환활 때 유의해주어야한다. 

 

그리고 위 방법대로 단축키를 지정할 수 없다면 앞에서부터 모든 알파벳을 확인하는 방법이다. 이 방법 또한 순회를 하며 아직 지정되지 않은 가장 이른 알파벳을 단축키로 지정해주면 된다.

-> isAnyWordKey() 함수로 구현해주었다.

#include <bits/stdc++.h>
#define fastio ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)

using namespace std;

int N;
bool alpha[26 + 1];
vector<string> word;

void input() {
	cin >> N;
	cin.ignore();
	for (int i = 0; i < N; i++) {
		string s; getline(cin, s);
		word.push_back(s);
	}
}

vector<string> split(string &s) {
	string temp = "";
	vector<string> ret;
	for (int i = 0; i < s.size(); i++) {
		if (s[i] == ' ') {
			ret.push_back(temp);
			temp = "";
		}
		else {
			temp += s[i];
		}
	}
	ret.push_back(temp);
	return ret;
}

string keyWord(char& alpha) {
	string pos = "";
	pos += "["; pos += alpha; pos += "]";
	return pos;
}

bool isFirstWordKey(vector<string>& temp) {
	for (auto& t : temp) {
		if ('a' <= t[0] && t[0] <= 'z') {
			if (!alpha[t[0] - 'a']) {
				alpha[t[0] - 'a'] = true;
				string pos = keyWord(t[0]);
				t = pos + t.substr(1, t.size());
				return true;
			}
		}
		else {
			if (!alpha[t[0] - 'A']) {
				alpha[t[0] - 'A'] = true;
				string pos = keyWord(t[0]);
				t = pos + t.substr(1, t.size());
				return true;
			}
		}
	}
	return false;
}

bool isAnyWordKey(vector<string>& temp) {
	for (auto& t : temp) {
		for (int i = 0; i < t.size(); i++) {
			if (t[i] == ' ') continue;
			if (('a' <= t[i] && t[i] <= 'z') && !alpha[t[i] - 'a']) {
				alpha[t[i] - 'a'] = true;

				string pos = keyWord(t[i]);

				string ret = t.substr(0, i);
				ret += pos;
				ret += t.substr(i + 1, t.size());

				t = ret;
				return true;
			}
			else if (('A' <= t[i] && t[i] <= 'Z') && !alpha[t[i] - 'A']) {
				alpha[t[i] - 'A'] = true;

				string pos = keyWord(t[i]);

				string ret = t.substr(0, i);
				ret += pos;
				ret += t.substr(i + 1, t.size());

				t = ret;
				return true;
			}
		}
	}
	return false;
}

string resultWord(vector<string>& temp) {
	string result;
	for (auto& t : temp) {
		result += t;
		result += " ";
	}
	return result;
}

vector<string> solution() {
	vector<string> answer;
	for (auto& s : word) {
		vector<string> temp = split(s);
		bool flag = isFirstWordKey(temp);
		if (!flag) isAnyWordKey(temp);

		answer.push_back(resultWord(temp));
	}
	return answer;
}

void output(vector<string>& result) {
	for (auto& ptr : result) {
		cout << ptr << endl;
	}
}

int main() {
	fastio;
	input();
	vector<string> answer = solution();
	output(answer);

	return 0;
}
728x90
반응형