Hyun's Wonderwall

[백준 실버1] 1283번: 단축키 지정 (구현) - Java 본문

Study/PS

[백준 실버1] 1283번: 단축키 지정 (구현) - Java

Hyun_! 2025. 7. 18. 16:59

1283번: 단축키 지정

https://www.acmicpc.net/problem/1283

 

문제
한글 프로그램의 메뉴에는 총 N개의 옵션이 있다. 각 옵션들은 한 개 또는 여러 개의 단어로 옵션의 기능을 설명하여 놓았다. 그리고 우리는 위에서부터 차례대로 각 옵션에 단축키를 의미하는 대표 알파벳을 지정하기로 하였다. 단축키를 지정하는 법은 아래의 순서를 따른다.
먼저 하나의 옵션에 대해 왼쪽에서부터 오른쪽 순서로 단어의 첫 글자가 이미 단축키로 지정되었는지 살펴본다. 만약 단축키로 아직 지정이 안 되어있다면 그 알파벳을 단축키로 지정한다.
만약 모든 단어의 첫 글자가 이미 지정이 되어있다면 왼쪽에서부터 차례대로 알파벳을 보면서 단축키로 지정 안 된 것이 있다면 단축키로 지정한다.
어떠한 것도 단축키로 지정할 수 없다면 그냥 놔두며 대소문자를 구분치 않는다.
위의 규칙을 첫 번째 옵션부터 N번째 옵션까지 차례대로 적용한다.


입력
첫째 줄에 옵션의 개수 N(1 ≤ N ≤ 30)이 주어진다. 둘째 줄부터 N+1번째 줄까지 각 줄에 옵션을 나타내는 문자열이 입력되는데 하나의 옵션은 5개 이하의 단어로 표현되며, 각 단어 역시 10개 이하의 알파벳으로 표현된다. 단어는 공백 한 칸으로 구분되어져 있다.

출력
N개의 줄에 각 옵션을 출력하는데 단축키로 지정된 알파벳은 좌우에 [] 괄호를 씌워서 표현한다.

예제 입력 1 
5
New
Open
Save
Save As
Save All

예제 출력 1 
[N]ew
[O]pen
[S]ave
Save [A]s
Sa[v]e All

예제 입력 2 
8
New window
New file
Copy
Undo
Format
Font
Cut
Paste
예제 출력 2 
[N]ew window
New [f]ile
[C]opy
[U]ndo
F[o]rmat
Fon[t]
Cut
[P]aste


풀이

시도

StringBuilder에 append를 많이 해서 풀었다.

String은 불변(immutable) 리터럴, StringBuffer와 StringBuilder는 가변(mutable). 기억하자!

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;

public class Main
{
    private void solution() throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        int n = Integer.parseInt(br.readLine());
        boolean[] alpha = new boolean[26];
        
        for (int i=0; i<n; i++) {
            String str = br.readLine();
            String[] words = str.split(" ");
            boolean assigned = false;
            StringBuilder newString = new StringBuilder();
            
            for(int j=0; j<words.length; j++){
                char c = words[j].charAt(0);
                int idx = Character.toUpperCase(c) - 'A';
                if(!assigned && idx >= 0 && idx < 26 && !alpha[idx]) {
                    alpha[idx] = true;
                    assigned = true;
                    newString.append('[').append(c).append(']').append(words[j], 1, words[j].length());
                } else {
                    newString.append(words[j]);
                }
                if (j != words.length-1) {
                    newString.append(' ');
                }
            }
            if (assigned) {
                sb.append(newString).append('\n');
            } else {
                int charIdx = -1;
                for(int k=0; k<str.length(); k++){
                    char c = str.charAt(k);
                    int idx = Character.toUpperCase(c) - 'A';
                    if(idx >= 0 && idx < 26 && !alpha[idx]) {
                        alpha[idx] = true;
                        charIdx = k;
                        break;
                    }
                }
                if (charIdx != -1)
                    sb.append(str, 0, charIdx).append('[').append(str.charAt(charIdx)).append(']').append(str, charIdx+1, str.length()).append('\n');
                else
                    sb.append(str).append('\n');
            }
        }
        System.out.println(sb);
    }
    
	public static void main(String[] args) throws Exception {
	    new Main().solution();
	}
}