Algorithm

[Algo] 백준 5052 전화번호 목록 JAVA

조핑구 2024. 7. 26. 13:31

문제 바로가기 : https://www.acmicpc.net/problem/5052

메모리 : 32052KB

시간 : 540 ms

언어 : Java 8


코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

public class Main {
	// 트라이 알고리즘을 써보자!
	static class Node {
		Map<Character, Node> chiledNode = new HashMap<>();
		// boolean isleaf; 사실 이문제에서는 필요없음
	}

	static class Trie {
		// 루트노드 생성
		Node rootNode = new Node();

		void insert(String str) {
			// 루트노드부터 시작하게
			Node node = this.rootNode;
			for (int i = 0; i < str.length(); i++) {
				// computeIfAbsent : 없으면 넣어주고, 있으면 값 리턴
				// chiledNode에 해당 글자가 없으면 그 글자 넣기
				node = node.chiledNode.computeIfAbsent(str.charAt(i), key -> new Node());
			}
			// 한바퀴 다 돌았으면 맨 마지막 노드에 true를 넣어준다.
			// node.isleaf = true;
		}

		boolean search(String str) {
			Node node = this.rootNode;
			for (int i = 0; i < str.length(); i++) {
				// getOrDefault : 값 리턴하거나 값이없으면 디폴트값 리턴
				// get 해도 됨
				node = node.chiledNode.getOrDefault(str.charAt(i), null);
				if (node == null) {
					// 해당 문자열은 일치하지 않는다.
					return false;
				}
			}
			// return node.isleaf; //일치했다면 맨 끝에 isleaf가 true 겠지 근데 이문제에선 노필요
			return true; // 일치하면 true 반환
		}
	}

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int TC = Integer.parseInt(br.readLine());
		for (int tc = 0; tc < TC; tc++) {
			Trie trie = new Trie(); // 매번 새거만들어서 충돌방지
			boolean flag = true;
			int N = Integer.parseInt(br.readLine());
			String[] arr = new String[N];
			for (int i = 0; i < N; i++) {
				arr[i] = br.readLine();
			}
			/*
			 * 정렬하면 길이순으로 정렬된다.
			 * 문제에서 같은 숫자가 들어가지않는다고 했기 때문에 같은 길이에서는 서로 비교할 필요가 없음
			 * 긴 길이부터 시작해 짧은 길이로 탐색해야한다.
			 */
			Arrays.sort(arr);
			// 제일 긴거 넣고
			trie.insert(arr[N - 1]);
			for (int n = N - 2; n >= 0; n--) {
				// 그 다음거랑 비교탐색 후
				if (trie.search(arr[n])) {
					// 일치하면 일관성 없다..
					flag = false;
					break;
				}
				// 해당 문자열 넣기
				trie.insert(arr[n]);
			}
			if (flag) {
				System.out.println("YES");
			} else {
				System.out.println("NO");
			}
		}
	}
}