백준 단축키 지정

KIMYEONGJUN·2024년 12월 11일
0
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

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

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

내가 이 문제를 보고 생각해본 부분

BufferedReader를 사용하여 입력받는다.
첫 번째 줄에서 옵션의 개수 N을 읽고, 이후 N개의 옵션 문자열을 읽는다.
Set<String> set을 사용하여 이미 사용된 단축키를 저장한다.
소문자를 구분하지 않기 위해 모두 대문자로 변환하여 저장한다.
각 옵션 문자열에 대해 단축키를 지정하는 과정을 반복한다.
단축키 지정 로직
첫 번째 단계:
각 옵션 문자열을 공백을 기준으로 나누어 단어 배열 words를 생성한다.
각 단어의 첫 글자를 검사하여, 해당 글자가 이미 사용된 단축키인지 확인해준다.
사용되지 않은 경우, 해당 글자를 단축키로 지정하고 결과 문자열을 생성하여 StringBuilder sb에 추가한다.
두 번째 단계:
모든 단어의 첫 글자가 이미 사용된 경우, 옵션 문자열 전체를 순회하여 사용되지 않은 단축키를 찾는다.
사용되지 않은 글자를 발견하면, 해당 글자를 단축키로 지정하고 결과 문자열을 생성하여 StringBuilder sb에 추가한다.
세 번째 단계:
단축키가 지정되지 않았을 경우, 원래의 옵션 문자열을 그대로 StringBuilder sb에 추가한다.
모든 옵션에 대해 처리한 후, StringBuilder에 저장된 내용을 출력한다.
getStartIndex:
단어 배열과 인덱스를 입력받아 해당 단어의 시작 인덱스를 계산하는 메서드이다.
주어진 인덱스까지의 모든 단어의 길이에 공백을 더하여 시작 인덱스를 반환한다.
전체흐름
N개의 옵션을 입력받고, 각 옵션에 대해 단축키를 지정한다.
단축키가 지정된 경우, 해당 글자를 []로 감싸서 문자열을 작성한다.
모든 단축키 지정이 완료된 후, 최종 결과를 출력한다.

코드로 구현

package baekjoon.baekjoon_25;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Set;

// 백준 1283번 문제
public class Main864 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        int N = Integer.parseInt(br.readLine());
        Set<String> set = new HashSet<>();

        for(int i = 0; i < N; i++) {
            String str = br.readLine();
            boolean isShortcutKey = false;
            String[] words = str.split(" ");

            // 1. 각 단어의 첫 글자로 단축키 지정
            for(int j = 0; j < words.length; j++) {
                char firstChar = words[j].charAt(0);
                String upperChar = String.valueOf(firstChar).toUpperCase();

                if(!set.contains(upperChar)) {
                    set.add(upperChar);
                    // 단축키 지정
                    sb.append(str.substring(0, getStartIndex(words, j)) + "[" + firstChar + "]" + str.substring(getStartIndex(words, j) + 1) + "\n");
                    isShortcutKey = true;
                    break;
                }
            }

            // 2. 모든 단어의 첫 글자가 사용되었다면 전체 문자열에서 단축키 지정
            if(!isShortcutKey) {
                for(int j = 0; j < str.length(); j++) {
                    char currentChar = str.charAt(j);
                    if(currentChar != ' ' && !set.contains(String.valueOf(currentChar).toUpperCase())) {
                        set.add(String.valueOf(currentChar).toUpperCase());
                        sb.append(str.substring(0, j) + "[" + currentChar + "]" + str.substring(j + 1) + "\n");
                        isShortcutKey = true;
                        break;
                    }
                }
            }

            // 3. 단축키가 지정되지 않았다면 원래 문자열 추가
            if(!isShortcutKey) {
                sb.append(str + "\n");
            }
        }
        System.out.print(sb.toString());
        br.close();
    }

    // 단어의 시작 인덱스를 계산하는 메서드
    static int getStartIndex(String[] words, int index) {
        int startIndex = 0;
        for(int k = 0; k < index; k++) {
            startIndex += words[k].length() + 1; // 단어 길이 + 공백
        }
        return startIndex;
    }
}

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글