문제 풀이/백준
[백준] 1283번. 단축키 지정(JAVA)
27200
2025. 3. 3. 21:43
문제
https://www.acmicpc.net/problem/1283
풀이(18분)
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
boolean[] alphabet = new boolean[26]; // 소문자 단어를 추적할 그룹
for(int i = 0; i < n; i++){ // n개의 테스트 케이스
String option = br.readLine(); // 옵션 읽어오기
String[] separation = option.split(" "); // 띄어쓰기를 통한 단어 구분
int separationIdx = 5; // 몇번째 단어에서 나왔는가
int wordIdx = 10; // 그 단어에서 몇번째 알파벳인가
for(int j = 0; j < separation.length; j++){ // 모든 단어에 대한 첫 번째 알파벳 검사
String temp = separation[j];
temp = temp.toLowerCase();
if(!alphabet[temp.charAt(0) - 'a']){ // 만약 아직 체크되지 않았다면
alphabet[temp.charAt(0) - 'a'] = true;
separationIdx = j;
wordIdx = 0;
break; // 저장 후 반복문 탈출
}
}
if(separationIdx == 5) { // 아직 체크된게 없다면
loop1:
for (int j = 0; j < separation.length; j++) { // 각 단어마다
for (int k = 1; k < separation[j].length(); k++) { // 모든 알파벳 순회
String temp = separation[j];
temp = temp.toLowerCase();
if (!alphabet[temp.charAt(k) - 'a']) { // 만약 아직 체크되지 않았다면
alphabet[temp.charAt(k) - 'a'] = true;
separationIdx = j;
wordIdx = k;
break loop1; // 저장 후 반복문 탈출
}
}
}
}
if(separationIdx == 5){ // 체크된 적이 없다면
System.out.println(option); // 원본 단어 출력
continue;
}
StringBuilder sb = new StringBuilder();
for(int j = 0; j < separation.length; j++){
if(separationIdx == j){
for(int k = 0; k < separation[j].length(); k++){
if(k != wordIdx){
sb.append(separation[j].charAt(k));
continue;
}
sb.append("["); // 체크된 부분에 대해서만 괄호를 통해 감싸줌
sb.append(separation[j].charAt(k));
sb.append("]");
}
sb.append(" ");
continue;
}
sb.append(separation[j] + " ");
}
System.out.println(sb);
}
}
}
문제 풀이 전략
작은 범위를 보고 단순한 브루트포스와 구현 문제라고 생각했다.
풀이 방법은 다음과 같다.
1. 일단 모든 알파벳(소문자)에 대해 체크 배열을 선언한다.
2. 각 옵션이 들어오면 순서대로 분리하여 첫 번째 알파벳을 먼저 검사한다.
3. 검사에 통과한다면 인덱스를 두개 저장한다.(몇 번째 단어인지, 몇 번째 알파벳인지)
3-1. 해당 알파벳에 대해 저장한다.
4. 검사에 통과하지 못한다면 하나의 단어에 대해 순차적으로 모든 알파벳을 검사한다.
4-1. 검사에 통과한다면 3의 과정과 동일한 작업을 한다.
5. 검사에 통과하지 못한다면 원본 단어를 출력한다.
5-1. 검사에 통과했다면 저장된 인덱스를 통해 []로 감싸준 뒤 출력한다.