내가 생각했을때 문제에서 원하는부분
첫째 줄에 옵션의 개수 N(1 ≤ N ≤ 30)이 주어진다.
둘째 줄부터 N+1번째 줄까지 각 줄에 옵션을 나타내는 문자열이 입력되는데 하나의 옵션은 5개 이하의 단어로 표현되며, 각 단어 역시 10개 이하의 알파벳으로 표현된다.
단어는 공백 한 칸으로 구분되어져 있다.
N개의 줄에 각 옵션을 출력하는데 단축키로 지정된 알파벳은 좌우에 [] 괄호를 씌워서 표현한다.
내가 이 문제를 보고 생각해본 부분
BufferedReader를 사용하여 입력받는다.
첫 번째 줄에서 옵션의 개수 N을 읽고, 이후 N개의 옵션 문자열을 읽는다.
Set<String> set을 사용하여 이미 사용된 단축키를 저장한다.
소문자를 구분하지 않기 위해 모두 대문자로 변환하여 저장한다.
각 옵션 문자열에 대해 단축키를 지정하는 과정을 반복한다.
단축키 지정 로직
첫 번째 단계:
각 옵션 문자열을 공백을 기준으로 나누어 단어 배열 words를 생성한다.
각 단어의 첫 글자를 검사하여, 해당 글자가 이미 사용된 단축키인지 확인해준다.
사용되지 않은 경우, 해당 글자를 단축키로 지정하고 결과 문자열을 생성하여 StringBuilder sb에 추가한다.
두 번째 단계:
모든 단어의 첫 글자가 이미 사용된 경우, 옵션 문자열 전체를 순회하여 사용되지 않은 단축키를 찾는다.
사용되지 않은 글자를 발견하면, 해당 글자를 단축키로 지정하고 결과 문자열을 생성하여 StringBuilder sb에 추가한다.
세 번째 단계:
단축키가 지정되지 않았을 경우, 원래의 옵션 문자열을 그대로 StringBuilder sb에 추가한다.
모든 옵션에 대해 처리한 후, StringBuilder에 저장된 내용을 출력한다.
getStartIndex:
단어 배열과 인덱스를 입력받아 해당 단어의 시작 인덱스를 계산하는 메서드이다.
주어진 인덱스까지의 모든 단어의 길이에 공백을 더하여 시작 인덱스를 반환한다.
전체흐름
N개의 옵션을 입력받고, 각 옵션에 대해 단축키를 지정한다.
단축키가 지정된 경우, 해당 글자를 []로 감싸서 문자열을 작성한다.
모든 단축키 지정이 완료된 후, 최종 결과를 출력한다.
코드로 구현
package baekjoon.baekjoon_25;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Set;
// 백준 1283번 문제
public class Main864 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(br.readLine());
Set<String> set = new HashSet<>();
for(int i = 0; i < N; i++) {
String str = br.readLine();
boolean isShortcutKey = false;
String[] words = str.split(" ");
// 1. 각 단어의 첫 글자로 단축키 지정
for(int j = 0; j < words.length; j++) {
char firstChar = words[j].charAt(0);
String upperChar = String.valueOf(firstChar).toUpperCase();
if(!set.contains(upperChar)) {
set.add(upperChar);
// 단축키 지정
sb.append(str.substring(0, getStartIndex(words, j)) + "[" + firstChar + "]" + str.substring(getStartIndex(words, j) + 1) + "\n");
isShortcutKey = true;
break;
}
}
// 2. 모든 단어의 첫 글자가 사용되었다면 전체 문자열에서 단축키 지정
if(!isShortcutKey) {
for(int j = 0; j < str.length(); j++) {
char currentChar = str.charAt(j);
if(currentChar != ' ' && !set.contains(String.valueOf(currentChar).toUpperCase())) {
set.add(String.valueOf(currentChar).toUpperCase());
sb.append(str.substring(0, j) + "[" + currentChar + "]" + str.substring(j + 1) + "\n");
isShortcutKey = true;
break;
}
}
}
// 3. 단축키가 지정되지 않았다면 원래 문자열 추가
if(!isShortcutKey) {
sb.append(str + "\n");
}
}
System.out.print(sb.toString());
br.close();
}
// 단어의 시작 인덱스를 계산하는 메서드
static int getStartIndex(String[] words, int index) {
int startIndex = 0;
for(int k = 0; k < index; k++) {
startIndex += words[k].length() + 1; // 단어 길이 + 공백
}
return startIndex;
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.