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;
}
}