Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
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
Archives
Today
Total
관리 메뉴

시간이 NullNull

[JAVA] [BOJ] 5052. 전화번호 목록 ver.2 Trie 본문

알고리즘

[JAVA] [BOJ] 5052. 전화번호 목록 ver.2 Trie

4NIng 2019. 8. 24. 02:46

Trie로 검색 혹은 이 글을 보러 오신 분은 전화번호 목록에 대해서 알 것이라고 생각하고 문제 설명은 넘어가겠습니다.

 

그리고 sort의 경우 본인이 구현하셔도 상관없지만

이 글에서 Point의 경우 Trie 이기에 라이브러리를 활용하였습니다.

( 그리고 sort의 경우 해주지 않으면 9112 다음에 911이 들어오면 문제가 발생하여 sort 해주었습니다. )

 

Trie의 개념의 경우 제가 이전에 써두었던 글을 참고하시면 더 이해가 잘 가실 것 같습니다.

글 링크 따윈 저는 상남자니까 걸어두지 않을께요

 

이 문제는 저번 문제와 다르게 번호가 들어왔을때

( 예를 들어, 911 이 입력되었고 다음줄에 9112가 들어오면 )

911 때문에 isTerminal이 true 인 상황에서 현재 자식노드의 2번 이 null 이면 911로 끝난 숫자가 있다는 것이고

그때 NO 를 출력하고 종료하면 됩니다.

 

위가 Key Point고 코드를 보면서 이해하시면 됩니다.

 

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

public class Main {
	static class TrieNode{
		TrieNode[] child;
		boolean isTerminal;
		
		public TrieNode() {
			this.child = new TrieNode[10];
			this.isTerminal = false;
		}
	}
	public static void main(String[] args) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		int T = Integer.parseInt(br.readLine());
		int n = 0;
		String str = "";
		String[] arr = null;
		TrieNode root = null;
		TrieNode node = null;
		int idx = 0;
		String result = "";
		for(int t=1; t<=T; ++t) {
			n = Integer.parseInt(br.readLine());
			arr = new String[n];
			for(int i=0; i<n; ++i) {
				arr[i] = br.readLine();
			}
			Arrays.sort(arr);
			root = new TrieNode();
			node = root;
			result = "YES";
			breakPoint:
			for(int i=0; i<n; ++i) {
				str = arr[i];
				node = root;
				for(int j=0; j<str.length(); ++j) {
					idx = str.charAt(j) - '0';
					if(node.isTerminal && node.child[idx] != null) {
						result = "NO";
						break breakPoint;
					}
					if(node.child[idx] == null) {
						node.child[idx] = new TrieNode();
					}
					if(j == str.length()-1) {
						node.isTerminal = true;
					}else {
						node = node.child[idx];
					}
				}
			}
			bw.write(result+"\n");
		}
		bw.close();
		br.close();
		
	}

}

'알고리즘' 카테고리의 다른 글

[JAVA] [KAKAO] 셔틀버스  (0) 2019.09.04
[JAVA] [KAKAO] 자동완성  (0) 2019.09.04
[JAVA] Trie 알고리즘  (0) 2019.08.24
[JAVA] [BOJ] 5525. IOIOI  (0) 2019.08.23
[JAVA] [BOJ] 17406. 배열돌리기 4  (0) 2019.08.20
Comments