코딩테스트 연습 기록

이종길·2022년 3월 13일
0

코딩테스트 연습

목록 보기
102/128

2022.03.13 78일차

백준 1283번 (단축키 지정)

문제

한글 프로그램의 메뉴에는 총 N개의 옵션이 있다. 각 옵션들은 한 개 또는 여러 개의 단어로 옵션의 기능을 설명하여 놓았다. 그리고 우리는 위에서부터 차례대로 각 옵션에 단축키를 의미하는 대표 알파벳을 지정하기로 하였다. 단축키를 지정하는 법은 아래의 순서를 따른다.

1. 먼저 하나의 옵션에 대해 왼쪽에서부터 오른쪽 순서로 단어의 첫 글자가 이미 단축키로 지정되었는지 살펴본다. 만약 단축키로 아직 지정이 안 되어있다면 그 알파벳을 단축키로 지정한다.
2. 만약 모든 단어의 첫 글자가 이미 지정이 되어있다면 왼쪽에서부터 차례대로 알파벳을 보면서 단축키로 지정 안 된 것이 있다면 단축키로 지정한다.
3. 어떠한 것도 단축키로 지정할 수 없다면 그냥 놔두며 대소문자를 구분치 않는다.
4. 위의 규칙을 첫 번째 옵션부터 N번째 옵션까지 차례대로 적용한다.

나의 풀이

  1. split, Set 활용해서 문제 접근
  2. 문자열은 StringBuilder로 추가시키기
  3. split으로 단어 구분, 첫글자(대문자로 변경)가 Set에 없으면 Set에 추가, 괄호 붙이면서 문자열 추가, 첫글자 이후부터 단어 끝까지 문자열 포함시키기(조건1)
  4. 조건1 만족되면 그대로 문자열 추가
  5. 조건1이 만족안되면 알파벳 차례대로 살펴보기(공백은 생략하기)
  6. 알파벳이 Set에 없으면 Set에 추가, 괄호 붙이면서 문자열 추가(조건2)
  7. 조건2 만족되면 그대로 알파벳 추가
  8. 만족 둘다 만족 안되면 기존 단어 출력시키기
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());

        Set<String> set = new HashSet<>();

        for (int i = 0; i < N; i++) {
            String temp = br.readLine();
            String[] tempArr = temp.split(" ");
            boolean cond1 = true;
            StringBuilder answer = new StringBuilder();

            for (String s : tempArr) {
                String first = s.charAt(0) + "";

                if (set.contains(first.toUpperCase()) || !cond1) {
                    answer.append(s).append(" ");
                } else {
                    cond1 = false;
                    set.add(first.toUpperCase());
                    answer.append("[").append(first).append("]").append(s.substring(1)).append(" ");
                }
            }

            if (cond1) {
                boolean cond2 = true;
                StringBuilder answer2 = new StringBuilder();

                for (int j = 0; j < temp.length(); j++) {
                    String index = temp.charAt(j) + "";

                    if (index.equals(" ")) {
                        answer2.append(index);
                        continue;
                    }

                    if (set.contains(index.toUpperCase()) || !cond2) {
                        answer2.append(index);
                    } else {
                        cond2 = false;
                        set.add(index.toUpperCase());
                        answer2.append("[").append(index).append("]");
                    }
                }

                if (cond2) {
                    System.out.println(temp);
                } else {
                    System.out.println(answer2);
                }
            } else {
                System.out.println(answer);
            }
        }
    }
}

생각하기

profile
Go High

0개의 댓글

관련 채용 정보