[백준] 5052 - 전화번호 목록 (java)

HaYeong Jang·2021년 1월 28일
0

[백준] 알고리즘

목록 보기
29/62
post-thumbnail

문제

전화번호 목록이 주어진다. 이때, 이 목록이 일관성이 있는지 없는지를 구하는 프로그램을 작성하시오.

전화번호 목록이 일관성을 유지하려면, 한 번호가 다른 번호의 접두어인 경우가 없어야 한다.

예를 들어, 전화번호 목록이 아래와 같은 경우를 생각해보자

  • 긴급전화: 911
  • 상근: 97 625 999
  • 선영: 91 12 54 26
    이 경우에 선영이에게 전화를 걸 수 있는 방법이 없다. 전화기를 들고 선영이 번호의 처음 세 자리를 누르는 순간 바로 긴급전화가 걸리기 때문이다. 따라서, 이 목록은 일관성이 없는 목록이다.

입력

첫째 줄에 테스트 케이스의 개수 t가 주어진다. (1 ≤ t ≤ 50) 각 테스트 케이스의 첫째 줄에는 전화번호의 수 n이 주어진다. (1 ≤ n ≤ 10000) 다음 n개의 줄에는 목록에 포함되어 있는 전화번호가 하나씩 주어진다. 전화번호의 길이는 길어야 10자리이며, 목록에 있는 두 전화번호가 같은 경우는 없다.

출력

각 테스트 케이스에 대해서, 일관성 있는 목록인 경우에는 YES, 아닌 경우에는 NO를 출력한다.

예제 입력

2
3
911
97625999
91125426
5
113
12340
123440
12345
98346

예제 출력

NO
YES

코드

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

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 t = Integer.parseInt(br.readLine());
        for (int i = 0; i < t; i++) {
            int n = Integer.parseInt(br.readLine());
            String[] num = new String[n];
            boolean result = true;

            for (int j = 0; j < n; j++) {
                num[j] = br.readLine();
            }
            Arrays.sort(num);

            for (int j = 1; j < n; j++) {
                if (num[j].startsWith(num[j - 1])) {
                    result = false;
                    break;
                }
            }

            if (result) {
                bw.write("YES\n");
            } else {
                bw.write("NO\n");
            }
        }

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

정리

알고리즘
1. 입력받은 숫자들로 이루어진 배열을 오름차순으로 정렬한다.
2. for 문을 돌면서 현재 단어 다음으로 오는 단어가 현재 단어로 시작하는지 확인한다.
3. 똑같이 시작한다면 NO를 출력한다.
profile
기억하기 위해 기록하는 개발로그👣

0개의 댓글