Problem Solving/Baekjoon

[백준] 5052 전화번호 목록 - Data Structure / Java

graycode 2023. 12. 6. 13:13

 문제 링크

 

5052번: 전화번호 목록

첫째 줄에 테스트 케이스의 개수 t가 주어진다. (1 ≤ t ≤ 50) 각 테스트 케이스의 첫째 줄에는 전화번호의 수 n이 주어진다. (1 ≤ n ≤ 10000) 다음 n개의 줄에는 목록에 포함되어 있는 전화번호가

www.acmicpc.net

 

 풀이 코드

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.HashMap;
import java.util.Map;

public class Main {

    static String[] arr;
    static TrieNode trie;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringBuilder sb = new StringBuilder();

        int t = Integer.parseInt(br.readLine());
        while (t-- > 0) {
            int n = Integer.parseInt(br.readLine());
            arr = new String[n];

            trie = new TrieNode();
            while (n-- > 0) trie.insert(arr[n] = br.readLine());

            sb.append(isConsistent() ? "YES\n" : "NO\n");
        }

        bw.write(sb.toString());
        bw.flush();
    }

    private static boolean isConsistent() {
        for (String s : arr) if (trie.contains(s)) return false;

        return true;
    }

    private static class TrieNode {
        Map<Character, TrieNode> child = new HashMap<>();
        boolean isWord;

        private void insert(String word) {
            TrieNode node = this;
            for (char c : word.toCharArray()) {
                node.child.computeIfAbsent(c, t -> new TrieNode());
                node = node.child.get(c);
            }

            node.isWord = true;
        }

        public boolean contains(String s) {
            TrieNode node = this;
            for (char c : s.toCharArray()) {
                if (!node.child.containsKey(c)) return false;
                node = node.child.get(c);
            }

            return !node.child.isEmpty();
        }
    }

}