본문 바로가기

코딩테스트/JAVA

[백준 JAVA] 1283번: 단축키 지정

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

 

import java.io.*;
import java.util.*;

public class Main {
    public static int N;
    public static int[] alpha;
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        N = Integer.parseInt(br.readLine());
        alpha = new int[26];

        for(int i = 0; i < N; i++){
            String cur = br.readLine();
            int key = findKey(" " + cur);

            if(key == -1) sb.append(cur);
            else {
                sb.append(cur, 0, key).append('[').append(cur.charAt(key)).append(']').append(cur.substring(key + 1));
            }
            sb.append('\n');
        }

        System.out.println(sb);

    }
    public static int findKey(String str){
        // 1. 단어의 첫글자 인덱스 찾기
        for(int j = 0; j < str.length(); j++){
            if(str.charAt(j) == ' '){ // 공백을 만났을때
                int now = Character.toUpperCase(str.charAt(j + 1)) - 'A';
                if(alpha[now] == 0) { // 다음단어가 한번도 쓰이지 않은 단어면
                    alpha[now] = 1;
                    return j;
                }
            }
        }

        // 2. 앞에서부터 찾기
        for(int j = 0; j < str.length(); j++){
            if(str.charAt(j) == ' ') continue;
            int now = Character.toUpperCase(str.charAt(j)) - 'A';
            if(alpha[now] == 0) { // 다음단어가 한번도 쓰이지 않은 단어면
                alpha[now] = 1;
                return j - 1;
            }
        }

        return -1;
    }
}

 

풀이시간 : 30분

풀이방법

1. 단어 앞에 공백을 붙인 뒤 findKey라는 단축키 알파벳의 인덱스를 반환하는 함수를 호출한다.

2. 먼저 공백이 들어온다면 각 단어의 첫글자이므로 기존에 단축키로 활용되는지 확인한 후 인덱스를 반환한다.

3. 모든 단어의 첫글자가 사용중일 경우 문장을 처음부터 검사하여 앞에서부터 기존에 단축키로 활용되는지 확인한 후 인덱스를 반환한다.

4. 만약 모두 사용중이라면 -1을 반환하여 그대로 출력하도록 한다.

 

회고

맨처음에는 인덱스로 접근하지 않고 각각의 케이스 별로 따로 출력하려 했었는데 번거로워서 인덱스를 사용하기로 하였다.

그리고 인덱스를 사용할 때도 그냥 메인 함수 내부에서만 처리하려니 분기처리가 복잡해져서 함수를 따로 빼서 리턴을 이용하기로 하였다.

맨 첫 단어도 검사해주기 위해 공백을 붙인 문자열을 함수의 파라미터로 제공하였는데 이 때문에 나중에 디버깅할때 시간이 좀 걸렸다. 

오래 걸리지는 않았지만 처음부터 잘 생각하도록하면 좋을거 같고 문제를 처음부터 풀려고 하지 말고 좀 더 생각하고 코드를 짜는 습관을 들이자.