본문 바로가기
Beakjoon&프로그래머스/Java

[백준/Java] 5052번 전화번호 목록

by 현장 2026. 2. 10.

-Code

import java.io.*;
import java.util.*;

public class BOJ5052 {
    public static void main(String[] args) throws IOException {
        BufferedReader br =
                new BufferedReader(new InputStreamReader(System.in));

        int testCase = Integer.parseInt(br.readLine());

        for (int test = 0; test < testCase; test++) {
            int numberCnt = Integer.parseInt(br.readLine());
            // 번호 받기
            String[] numbers = new String[numberCnt];
            for (int i = 0; i < numberCnt; i++) {
                numbers[i] = br.readLine();
            }
            // 사전순 정렬
            Arrays.sort(numbers);

            boolean flag = true;
            for (int i = 1; i < numberCnt; i++) {
                // 사전순 정렬로 접두사가 비슷한 것끼리 묶임
                if (numbers[i].startsWith(numbers[i - 1])){
                    // 접두사인 경우 flag 처리 및 탈출
                    flag = false;
                    break;
                }
            }
            System.out.println(flag ? "YES" : "NO");
        }
        br.close();
    }
}

처음에는 길이와 값을 기준으로 정렬해서 2중 for문을 통해 검사하는 로직을 썼으나 시간 초과문제가 생겼습니다. 그럼 어떻게 해야 좋을까 생각을 하는데 무조건 정렬은 사용해야 할거 같고 for문 1개로 할 수 있는 방법이 있나에 대한 의문이 들었습니다. 그래서 고민하다가 답이 나오지 않아서 힌트를 얻고자 찾아보니 그냥 사전순 정렬을 하면 접두사가 비슷한 것끼리 묶이기 때문에 이를 이용하며 된다에 대해 알게 되고 해결하였습니다.