백준 1283번 - 단축키 지정

황제연·2024년 9월 29일
0

알고리즘

목록 보기
117/169
post-thumbnail

문제 탐색하기

입력 자료 정리

  1. n은 이후 들어올 문자열들의 개수이다
  2. 이후 들어오는 문자열들은 문자의 집합으로 각 문자들은 공백으로 구분할 수 있다

해결방법 추론

  1. 입력값도 작고 그냥 주어진 조건에 따라 문제를 해결하는 문자열 + 구현 문제다
  2. 문자열을 각각의 테스트 케이스로 보고 공백을 기준으로 각 단어를 뽑아서 확인해준다
  3. 먼저 각 단어의 첫글자를 확인해서 단축키로 지정해준다
  4. 만약 지정 가능한 경우가 있다면 그대로 출력하고,
    아니라면 이제는 단어마다 모든 글자를 확인한다
  5. 3, 4번에서 모든 글자를 단축키로 지정하지 못한다면 그냥 그 단어를 그대로 저장해서 출력한다

시간복잡도 계산

  1. 시간복잡도는 간단하다 n만큼의 탐색이 발생하며,
    이후 단어만큼, 단어의 문자열만큼이 발생한다.
  2. 이때 단어는 최대 5개고, 10개 이하의 알파벳으로 표현되므로
    최대 탐색은 n x 5 x 10이 되며, 시간복잡도는 O(n x 50)이 된다
  3. 따라서 시간제한안에 문제를 해결할 수 있다

코드 설계하기

입력값 상태 관리하기

  1. n은 int형 변수에 관리해준다
  2. 문자들은 split해서 String[] 배열에 저장해준다
  3. 단축키를 중복없이 저장하기 위해서 Set 자료구조를 사용한다
    이때, 단어를 등록할 것이므로 Character 타입으로 지정한다
  4. 매 탐색에서는 단축키를 발견했는지 확인하기 위한 boolean타입의 변수와
    출력을 위한 문자열을 관리하는 StringBuilder를 만든다

구현 설계

  1. 문자열의 대소문자 구분없이라는 조건이 있으므로 모든 비교는 소문자로 비교해준다
  2. 단축키가 있다면 []를 붙여서 넣어주고, 아니면 그대로 넣어준다
  3. 앞서 추론한대로 조건에 나와있는
    모든 단어의 첫글자 -> 단축키 지정 불가한 경우 모든 단어 탐색 후 지정
    순서로 진행한다

출력값 설계

  1. 완성한 StringBuilder의 값을 문자열로 출력하면 정답이 된다.

정답코드

(1회차 시도 성공!)

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));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        int n = Integer.parseInt(br.readLine());
        Set<Character> alpha = new HashSet<>();
        for (int i = 0; i < n; i++) {
            String[] s = br.readLine().split(" ");
            StringBuilder sb = new StringBuilder();

            boolean isFind = false;
            for (String word : s) {

                if(!isFind && !alpha.contains(word.toLowerCase().charAt(0))){
                    alpha.add(word.toLowerCase().charAt(0));
                    sb.append("[" + word.charAt(0) + "]" + word.substring(1) +" ");
                    isFind = true;
                }else{
                    sb.append(word + " ");
                }
            }

            if(isFind){
                bw.write(sb.toString().trim()+"\n");
            }else{
                sb = new StringBuilder();
                isFind = false;
                for (String word : s) {
                    for (int j = 0; j < word.length(); j++) {
                        if(!isFind && !alpha.contains(word.toLowerCase().charAt(j))){
                            alpha.add(word.toLowerCase().charAt(j));
                            sb.append("[" + word.charAt(j) + "]");
                            isFind = true;
                        }else{
                            sb.append(word.charAt(j));
                        }
                    }
                    sb.append(" ");
                }
                bw.write(sb.toString().trim()+"\n");
            }

        }




        br.close();
        bw.close();
    }
}

문제 링크

1283번 - 단축키 지정

profile
Software Developer

0개의 댓글