728x90
반응형
https://www.acmicpc.net/problem/1283
문제
한글 프로그램의 메뉴에는 총 N개의 옵션이 있다. 각 옵션들은 한 개 또는 여러 개의 단어로 옵션의 기능을 설명하여 놓았다. 그리고 우리는 위에서부터 차례대로 각 옵션에 단축키를 의미하는 대표 알파벳을 지정하기로 하였다. 단축키를 지정하는 법은 아래의 순서를 따른다.
- 먼저 하나의 옵션에 대해 왼쪽에서부터 오른쪽 순서로 단어의 첫 글자가 이미 단축키로 지정되었는지 살펴본다. 만약 단축키로 아직 지정이 안 되어있다면 그 알파벳을 단축키로 지정한다.
- 만약 모든 단어의 첫 글자가 이미 지정이 되어있다면 왼쪽에서부터 차례대로 알파벳을 보면서 단축키로 지정 안 된 것이 있다면 단축키로 지정한다.
- 어떠한 것도 단축키로 지정할 수 없다면 그냥 놔두며 대소문자를 구분치 않는다.
- 위의 규칙을 첫 번째 옵션부터 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
반응형
'BOJ > 문자열 (해시,맵)' 카테고리의 다른 글
[C/C++] 백준 - 1213번 (팰린드롬 만들기) (2) | 2023.06.19 |
---|---|
[C/C++] 백준 - 1701번 : Cubeditor [KMP 알고리즘] (0) | 2022.12.27 |
[Python] 백준 - 9536번 : 여우는 어떻게 울지? (0) | 2022.05.14 |
[Python] 백준 - 6996번 : 애너그램 (0) | 2021.12.24 |
[Python] 백준 - 5525번 : IOIOI (0) | 2021.12.17 |