본문 바로가기
백준 문제 풀이

<코테 챌린지> 도비의 난독증 테스트 (백준 2204번)

by _비니_ 2024. 10. 23.

❓ 문제

꿍은 도비에게 영어단어들을 제시한 후 어떤 단어가 대소문자를 구분하지 않고 사전순으로 가장 앞서는지 맞추면 양말을 주어 자유를 얻게해준다고 하였다.

하지만 인성이 좋지 않은 꿍은 사실 그러고 싶지 않았기 때문에 대소문자를 마구 섞어가며 단어들을 제시했다. 예를 들어, apPle은 Bat보다 앞서지만 AnT보다는 뒤에 있는 단어다.

도비에게 희망은 여러분뿐이다! 여러분이 도비에게 자유를 선물해주도록 하자!

📥 입력

각 테스트케이스는 정수 n (2 ≤ n ≤ 1000) 으로 시작하며 주어지는 단어의 개수를 뜻한다.

다음 각 n줄은 길이가 최대 20인 단어가 주어지며 대소문자의 구분을 없앴을 때 똑같은 단어는 주어지지 않는다.

마지막 입력은 0이 주어진다.

📤 출력

각 줄에 각 테스트케이스에서 사전상 가장 앞서는 단어를 출력한다.

📥 예제 입력

3
Cat
fat
bAt
4
call
ball
All
Hall
0

📤 예제 출력

bAt
All

 

👩🏻‍💻 내 코드

package baekjoon.코테챌린지;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Scanner;

public class 도비의난독증테스트 {
    public static void main(String[] args) {
        
        // 제일 처음 알파벳을 비교해 정렬
        // 만약 동일한 알파벳이 나오면 다음 알파벳으로 비교 후 정렬
        // 정렬시 대소문자 구분 X

        Scanner in = new Scanner(System.in);
        HashMap<String, String> hashMap = new HashMap<>(); 

        while (true) {
            int T = in. nextInt();

            if(T==0) break;

            String[] arr = new String[T];
            for(int i = 0; i < T; i++) {
                arr[i] = in.next();
            }

            for (int i = 0; i < T; i++) {
                String lowerCase = arr[i].toLowerCase();
                hashMap.put(lowerCase,arr[i]);
                arr[i] = arr[i].toLowerCase();

            }

            Arrays.sort(arr);
            System.out.println(hashMap.get(arr[0]));
            
        }

    }
}

 

💡 문제 접근

 

이 문제는 문자열이 주어지면, 대소문자를 구분하지 않고 사전 순으로 정렬해 가장 앞에 오는 문자열을 출력하는 문제이다.

즉 문제를 해결하기 위해 아래의 순서로 해결해가야 한다

  1. 대소문자를 구분하지 않고 정렬
  2. 원래의 대소문자로 돌린 후 가장 먼저 온 문자열 출력

 

이 문제를 해결하기 위해서는 HashMap을 사용해야 한다.

HashMap을 사용하는 이유❓❓❓

  • 문자열을 소문자로 변환하여 정렬하면서도, 원래의 대소문자 형태를 유지하고 출력하기 위해서이다.
  • 소문자로 변환된 문자열을 키로, 원래 문자열을 값으로 저장한다.
    • 대소문자를 구분하지 않고 정렬하기 위해서는 모든 문자열을 소문자로 변환해야 하지만, 최종 출력할 때는 그 문자열의 원래 대소문자 형태를 사용해야 한다.
    • 소문자로 변환된 문자열과 원래 문자열을 매핑하기 위해 HashMap을 사용한다.

 

HashMap<String, String> hashMap = new HashMap<>();
  • 원래 문자열을 소문자로 변환한 문자열과 매핑하기 위한 HashMap을 선언한다.
  • key는 소문자로 변환된 문자열, value는 원래의 대소문자가 섞인 문자열이다.

 

String lowerCase = arr[i].toLowerCase();
  • 현재 문자열 arr[i]를 소문자로 변환하여 lowerCase 변수에 저장한다.

 

hashMap.put(lowerCase, arr[i]); (hashMap.put(key, value))
  • 소문자로 변환된 문자열을 키로, 원래 문자열 arr[i]를 값으로 hashMap에 저장한다.
    • 💡HashMap의 put 메서드는 키(key)와 값(value)을 저장할 때 사용된다💡
arr[i] = arr[i].toLowerCase();
Arrays.sort(arr);
  • 문자열 배열 자체를 소문자로 변환된 값으로 업데이트 한 후 정렬한다.

 

System.out.println(hashMap.get(arr[0]));
  • 정렬된 arr 배열에서 첫 번째 값(arr[0])을 가져온다.
  • 이 때 get으로 출력하는 이유는 원래 문자열, 즉 ‘값’을 출력해주어야 하기 때문이다.
반응형