1. 문제 링크
https://www.acmicpc.net/problem/1283
2. 문제

요약
- 10개 이하의 알파벳으로 표현되는 단어들을 이용하여 5개 이하의 단어로 표현되는 옵션을 만듭니다.
- 각 옵션의 기능에 대한 설명이 N개가 주어지는데 이를 보고 각 옵션에 단축키를 지정합니다.
- 단축키 지정하는 방법
- 하나의 옵션에 대해 왼쪽부터 오른쪽으로 단어의 첫 글자가 단축키로 지정된 적이 있는지 보고 지정이 안 되어있다면 그것을 단축키로 정합니다.
- 만약 지정이 되어있다면 알파벳을 왼쪽부터 보고 지정 안 된 것이 있다면 그것을 단축키로 지정합니다.
- 단축키로 지정할 알파벳이 없다면 그냥 두고 대소문자는 구분하지 않습니다.
- 각 옵션별로 단축키를 지정한 후, 해당 단축키에 []를 추가하여 N개의 옵션을 출력합니다.
- 입력: 첫 번째 줄에는 옵션의 개수 N이 주어지고 두 번째 줄부터는 옵션을 나타내는 문자열이 주어집니다.
- 출력: 단축키로 지정된 알파벳 좌우에 []를 씌워서 N개의 옵션을 출력합니다.
3. 소스코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class Main {
public boolean case1(ArrayList<String> temp, ArrayList<String> shortcut, ArrayList<String> result) {
for(int i = 0; i < temp.size(); i++) {
if(!shortcut.contains(temp.get(i).substring(0, 1).toLowerCase())) {
shortcut.add(temp.get(i).substring(0, 1).toLowerCase());
String temp_str = "";
for(int j = 0; j < temp.size(); j++) {
if(i == j) {
temp_str += "[" + temp.get(j).substring(0, 1) + "]" + temp.get(j).substring(1) + " ";
} else {
temp_str += temp.get(j) + " ";
}
}
result.add(temp_str);
return true;
}
}
return false;
}
public boolean case2(String temp, ArrayList<String> shortcut, ArrayList<String> result) {
for(int i = 0; i < temp.length(); i++) {
if(temp.substring(i, i + 1).equals(" "))
continue;
if(!shortcut.contains(temp.substring(i, i + 1).toLowerCase())) {
shortcut.add(temp.substring(i, i + 1).toLowerCase());
result.add(temp.substring(0, i) + "[" + temp.substring(i, i + 1) + "]" + temp.substring(i + 1));
return true;
}
}
return false;
}
public ArrayList<String> getShortcut(String[] words) {
ArrayList<String> result = new ArrayList<String>();
ArrayList<String> shortcut = new ArrayList<String>();
shortcut.add(words[0].substring(0, 1).toLowerCase());
result.add("[" + words[0].substring(0, 1) + "]" + words[0].substring(1));
for(int i = 1; i < words.length; i++) {
ArrayList<String> temp = new ArrayList<String>();
StringTokenizer st = new StringTokenizer(words[i]);
boolean isShortcut = true;
while(st.hasMoreTokens()) {
temp.add(st.nextToken());
}
if(case1(temp, shortcut, result)) {
continue;
} else {
if(case2(words[i], shortcut, result)) {
continue;
} else {
result.add(words[i]);
}
}
}
return result;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int num = Integer.parseInt(br.readLine());
String[] words = new String[num];
for(int i = 0; i < num; i++) {
words[i] = br.readLine();
}
br.close();
Main m = new Main();
ArrayList<String> result = m.getShortcut(words);
for(int i = 0; i < result.size(); i++) {
bw.write(result.get(i) + "\n");
}
bw.flush();
bw.close();
}
}
4. 접근
- 단축키를 지정하는 순서가 나와있으므로 해당 순서를 구현하여 단축키를 구하면 됩니다.
- 첫 번째 케이스인 각 단어별로 첫 번째 알파벳이 단축키가 될 수 있는지 확인하는 케이스와 두 번째 케이스인 왼쪽부터 알파벳을 살피며 단축키가 될 수 있는지 확인하는 케이스를 각각 구현합니다.
- 이 때 대소문자는 구분하지 않기 때문에 단축키를 모두 대문자 혹은 소문자로 맞춰야 하는데 저는 모두 소문자로 하였습니다.
- 각 케이스에서는 단축키가 될 수 있는지 확인하고 될 수 없다면 다음 단계로 넘어가기 위해 false를 반환하고 단축키가 될 수 있다면 지정된 단축키를 저장하는 ArrayList에 해당 단축키를 소문자로 변경하여 저장하고 해당 단축키 좌우에 []를 씌운 String을 다른 ArayList에 저장합니다.
- 두 번째 케이스에서 단축키가 될 수 있는지 확인할 때는 공백은 알파벳이 아니므로 공백은 건너뛰고 진행합니다.
- 만약 두 케이스 모두 false를 반환한다면, 해당 단어를 그대로 두겠다고 했으므로 해당 단어를 결과에 해당하는 ArrayList에 저장하고 이 ArrayList를 출력합니다.