백준 단축키 지정

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개의 댓글

관련 채용 정보