Post

BOJ_5052_전화번호 목록 (Java)

BOJ_5052_전화번호 목록 (Java)

[Gold IV] 전화번호 목록 - 5052

문제 링크

성능 요약

메모리: 107912 KB, 시간: 328 ms

분류

자료 구조, 정렬, 문자열, 트리, 트라이

제출 일자

2024년 12월 11일 04:53:18

문제 설명

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

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

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

  • 긴급전화: 911
  • 상근: 97 625 999
  • 선영: 91 12 54 26

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

입력

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

출력

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

문제 풀이

두가지 방법으로 풀었다. 첫번째는 startsWith매서드, 두번째는 트라이다.

코드

  • startsWith() 사용 코드 ```java /**
  • Author: nowalex322, Kim HyeonJae */

import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileInputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.util.Arrays; import java.util.StringTokenizer;

public class Main { static BufferedReader br; static BufferedWriter bw; static StringTokenizer st; static StringBuilder sb = new StringBuilder();

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public static void main(String[] args) throws Exception {
    new Main().solution();
}

public void solution() throws Exception {
    br = new BufferedReader(new InputStreamReader(System.in)); //        br = new BufferedReader(new InputStreamReader(new FileInputStream("src/main/java/BOJ_5052_전화번호목록/input.txt")));
    bw = new BufferedWriter(new OutputStreamWriter(System.out));

    int T = Integer.parseInt(br.readLine());
    while (T-- > 0) {
        int n = Integer.parseInt(br.readLine());
        String[] s = new String[n];
        for (int i = 0; i < n; i++) {
            String num = br.readLine();
            s[i] = num;
        }

        Arrays.sort(s);

        boolean flag = true;
        for (int i = 0; i < s.length - 1; i++) {
            if (s[i + 1].startsWith(s[i])) {
                flag = false;
                sb.append("NO").append("\n");
                break;
            }
        }
        if (flag) {
            sb.append("YES").append("\n");
        }
    }
    bw.write(sb.toString());
    bw.flush();
    bw.close();
    br.close();
}

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
---
- Trie 구현 코드
```java
/**
 * Author: nowalex322, Kim HyeonJae
 */
import java.io.*;
import java.util.*;

public class Main {
	class Trie{
		Trie[] children = new Trie[10];
		boolean isEnd;
		Trie(){
			for(int i=0; i<10; i++) {
				children[i] = null;
			}
			isEnd = false;
		}
	}
	static BufferedReader br;
	static BufferedWriter bw;
	static StringTokenizer st;
	static StringBuilder sb = new StringBuilder();
	static Trie root;
	static boolean flag;
	public static void main(String[] args) throws Exception {
		new Main().solution();
	}

	public void solution() throws Exception {
		br = new BufferedReader(new InputStreamReader(System.in));
//		br = new BufferedReader(new InputStreamReader(new FileInputStream("input.txt")));
		bw = new BufferedWriter(new OutputStreamWriter(System.out));

		int T = Integer.parseInt(br.readLine());
		while(T-->0) {
			root = new Trie();
			int n = Integer.parseInt(br.readLine());
			
			flag = true;
			for(int i=0; i<n; i++) {
				String num = br.readLine();
				insertNum(num);
			}
			
			sb.append(flag ? "YES" : "NO").append("\n");
		}

		bw.write(sb.toString());
		bw.flush();
		bw.close();
		br.close();
	}
	private void insertNum(String num) {
		Trie trie = root;
		
		for(int i=0; i<num.length(); i++) {
			int number = num.charAt(i) - '0';
			
			if(trie.isEnd) {
				flag = false;
				return;
			}
			
			if(trie.children[number]==null) {
				trie.children[number] = new Trie();
			}
			
			trie = trie.children[number];
		}
		
		if(trie.isEnd) {
			flag = false;
			return;
		}
		
		for(int i=0; i<10; i++) {
			if(trie.children[i] != null) {
				flag = false;
				return;
			}
		}
		trie.isEnd = true;
	}
}
This post is licensed under CC BY 4.0 by the author.