[BaekJoon] 1283 단축키 지정

오태호·2022년 3월 17일
0

1.  문제 링크

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

2.  문제

요약

  • 10개 이하의 알파벳으로 표현되는 단어들을 이용하여 5개 이하의 단어로 표현되는 옵션을 만듭니다.
  • 각 옵션의 기능에 대한 설명이 N개가 주어지는데 이를 보고 각 옵션에 단축키를 지정합니다.
  • 단축키 지정하는 방법
    1. 하나의 옵션에 대해 왼쪽부터 오른쪽으로 단어의 첫 글자가 단축키로 지정된 적이 있는지 보고 지정이 안 되어있다면 그것을 단축키로 정합니다.
    2. 만약 지정이 되어있다면 알파벳을 왼쪽부터 보고 지정 안 된 것이 있다면 그것을 단축키로 지정합니다.
    3. 단축키로 지정할 알파벳이 없다면 그냥 두고 대소문자는 구분하지 않습니다.
  • 각 옵션별로 단축키를 지정한 후, 해당 단축키에 []를 추가하여 N개의 옵션을 출력합니다.
  • 입력: 첫 번째 줄에는 옵션의 개수 N이 주어지고 두 번째 줄부터는 옵션을 나타내는 문자열이 주어집니다.
  • 출력: 단축키로 지정된 알파벳 좌우에 []를 씌워서 N개의 옵션을 출력합니다.

3.  소스코드

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.StringTokenizer;

public class Main {
	public boolean case1(ArrayList<String> temp, ArrayList<String> shortcut, ArrayList<String> result) {
		for(int i = 0; i < temp.size(); i++) {
			if(!shortcut.contains(temp.get(i).substring(0, 1).toLowerCase())) {
				shortcut.add(temp.get(i).substring(0, 1).toLowerCase());
				String temp_str = "";
				for(int j = 0; j < temp.size(); j++) {
					if(i == j) {
						temp_str += "[" + temp.get(j).substring(0, 1) + "]" + temp.get(j).substring(1) + " ";
					} else {
						temp_str += temp.get(j) + " ";
					}
				}
				result.add(temp_str);
				return true;
			}
		}
		return false;
	}
	
	public boolean case2(String temp, ArrayList<String> shortcut, ArrayList<String> result) {
		for(int i = 0; i < temp.length(); i++) {
			if(temp.substring(i, i + 1).equals(" "))
				continue;
			if(!shortcut.contains(temp.substring(i, i + 1).toLowerCase())) {
				shortcut.add(temp.substring(i, i + 1).toLowerCase());
				result.add(temp.substring(0, i) + "[" + temp.substring(i, i + 1) + "]" + temp.substring(i + 1));
				return true;
			}
		}
		return false;
	}
	
	public ArrayList<String> getShortcut(String[] words) {
		ArrayList<String> result = new ArrayList<String>();
		ArrayList<String> shortcut = new ArrayList<String>();
		shortcut.add(words[0].substring(0, 1).toLowerCase());
		result.add("[" + words[0].substring(0, 1) + "]" + words[0].substring(1));
		for(int i = 1; i < words.length; i++) {
			ArrayList<String> temp = new ArrayList<String>();
			StringTokenizer st = new StringTokenizer(words[i]);
			boolean isShortcut = true;
			while(st.hasMoreTokens()) {
				temp.add(st.nextToken());
			}
			if(case1(temp, shortcut, result)) {
				continue;
			} else {
				if(case2(words[i], shortcut, result)) {
					continue;
				} else {
					result.add(words[i]);
				}
			}
		}
		return result;
	}
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		int num = Integer.parseInt(br.readLine());
		String[] words = new String[num];
		for(int i = 0; i < num; i++) {
			words[i] = br.readLine();
		}
        br.close();
		Main m = new Main();
		ArrayList<String> result = m.getShortcut(words);
		for(int i = 0; i < result.size(); i++) {
            bw.write(result.get(i) + "\n");
		}
        bw.flush();
        bw.close();
	}
}

4.  접근

  • 단축키를 지정하는 순서가 나와있으므로 해당 순서를 구현하여 단축키를 구하면 됩니다.
  • 첫 번째 케이스인 각 단어별로 첫 번째 알파벳이 단축키가 될 수 있는지 확인하는 케이스와 두 번째 케이스인 왼쪽부터 알파벳을 살피며 단축키가 될 수 있는지 확인하는 케이스를 각각 구현합니다.
  • 이 때 대소문자는 구분하지 않기 때문에 단축키를 모두 대문자 혹은 소문자로 맞춰야 하는데 저는 모두 소문자로 하였습니다.
  • 각 케이스에서는 단축키가 될 수 있는지 확인하고 될 수 없다면 다음 단계로 넘어가기 위해 false를 반환하고 단축키가 될 수 있다면 지정된 단축키를 저장하는 ArrayList에 해당 단축키를 소문자로 변경하여 저장하고 해당 단축키 좌우에 []를 씌운 String을 다른 ArayList에 저장합니다.
  • 두 번째 케이스에서 단축키가 될 수 있는지 확인할 때는 공백은 알파벳이 아니므로 공백은 건너뛰고 진행합니다.
  • 만약 두 케이스 모두 false를 반환한다면, 해당 단어를 그대로 두겠다고 했으므로 해당 단어를 결과에 해당하는 ArrayList에 저장하고 이 ArrayList를 출력합니다.
profile
자바, 웹 개발을 열심히 공부하고 있습니다!

0개의 댓글

관련 채용 정보