백준 1283 - 단축키 지정

Updated:

Java

1283 번 - 단축키 지정

문제

접근 방법

옵션(한 줄)을 하나씩 받아 1,2,3 번 중 해당하는 조건에 따라 출력한다.

코드

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

public class Main {
    static int n;
    static boolean[] vis;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer stk;
        n = stoi(br.readLine());

        vis = new boolean[26];
        List<String> word, bak;
        String str;
		// 옵션을 하나씩 받는다.
        next : for(int turn = 0; turn < n; turn++){
            word = new ArrayList<>();
            bak = new ArrayList<>();
            stk = new StringTokenizer(br.readLine());

            while(stk.hasMoreTokens()){
            	str = stk.nextToken();
                word.add(str.toLowerCase());
                bak.add(str);
            }

            int size = word.size(), idx;
            char[] charArr;
            // 1번 : 왼쪽 단어부터 오른쪽 순서로 단어의 첫 글자가 이미 단축키로 지정되었는지 살펴본다
            for(int i = 0; i < size; i++){
            	idx = word.get(i).charAt(0) - 'a';
                if(!vis[idx]){
                    vis[idx] = true;
                    System.out.println(makeShortcut(i, 0, size, bak));
                    continue next;
                }
            }
            // 2번 : 만약 모든 단어의 첫 글자가 이미 지정이 되어있다면 왼쪽에서부터 차례대로 알파벳을 보면서 단축키로 지정 안 된 것이 있다면 단축키로 지정한다.
            for(int i = 0; i < size; i++){
            	charArr = word.get(i).toCharArray();
            	for(int j = 0; j < charArr.length; j++) {
            		idx = charArr[j] - 'a';

            		if(!vis[idx]){
                        vis[idx] = true;
                        System.out.println(makeShortcut(i, j, size, bak));
                        continue next;
                    }
            	}
            }
            // 3번 : 어떠한 것도 단축키로 지정할 수 없다면 그냥 놔두며 대소문자를 구분치 않는다.
            for(int i = 0; i < size; i++) {
            	System.out.print(bak.get(i) + " ");
        	}
            System.out.println();
        }
        br.close();
    }
	// [ ]를 추가할 단어의 알파벳 위치를 받아 단축키를 만든다.
	// wIdx : 단어 위치 / cIdx : 알파벳 위치
    static String makeShortcut(int wIdx, int cIdx, int size, List<String> list){
    	StringBuilder result = new StringBuilder();
    	char[] charArr;
    	int len;
        // 단어를 순회하여 StringBuilder에 추가한다.
    	for(int i = 0; i < size; i++){
    		charArr = list.get(i).toCharArray();
    		len = charArr.length;

    		for(int j = 0; j < len; j++) {
    			if(i == wIdx && j == cIdx)
    				result.append("[").append(charArr[j]).append("]");
    			else
    				result.append(charArr[j]);
    		}
    		result.append(" ");
    	}

        return result.toString();
    }

    static int stoi(String str) {
        return Integer.parseInt(str);
    }
}

총평

후기

개선할 점