문제 풀이/백준

[백준] 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. 검사에 통과했다면 저장된 인덱스를 통해 []로 감싸준 뒤 출력한다.