๐Ÿค–/์•Œ๊ณ ๋ฆฌ์ฆ˜ ์žฌํ™œ์šด๋™

[๋ฐฑ์ค€/Java] ์ „ํ™”๋ฒˆํ˜ธ ๋ชฉ๋ก

sssbin 2025. 4. 23. 23:02

 

https://www.acmicpc.net/problem/5052

 

์ „์— ํ’€ ๋• ๋ฌธ์ž์—ด ๋น„๊ตํ•ด์„œ ํ’€์—ˆ๋Š”๋ฐ, ์ด๋ฒˆ์— ํŠธ๋ผ์ด ์จ๋ณด๋ ค๊ณ  ํ’€์—ˆ๋‹ค.

 

ํŠธ๋ผ์ด๋Š” ๋ฌธ์ž์—ด ๊ฒ€์ƒ‰์„ ๋น ๋ฅด๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.

์ž๋ฃŒ๊ฐ€ ์ •์ˆ˜ํ˜•์ผ ๋•Œ ์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ๊ฐ€ O(logN)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๋Š”๋ฐ,

๋ฌธ์ž์—ด์ผ ๋• ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๊ฐ€ M์ด๋ฉด O(MlogN) ์ด๋‹ค.

์ด๋•Œ ํŠธ๋ผ์ด๋ฅผ ์ด์šฉํ•˜๋ฉด O(M)์— ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 

import java.io.*;
import java.util.*;

public class boj5052 {

    private static class Trie {
        boolean isEnd = false;
        Map<Character, Trie> child = new HashMap<>();

        public void add(String num) {
            Trie trie = this;
            int size = num.length();

            for (int i=0; i<size; i++) {
                char c = num.charAt(i);

                trie.child.putIfAbsent(c, new Trie());
                trie = trie.child.get(c);

                if (i == size - 1) {
                    trie.isEnd = true;
                }
            }
        }

        public boolean contains(String num) {
            Trie trie = this;
            int size = num.length();

            for (int i=0; i<size; i++) {
                char c = num.charAt(i);
                Trie child = trie.child.get(c);

                if (child == null) {
                    return false;
                }

                if (child.isEnd) {
                    return true;
                }

                trie = child;
            }

            return false;
        }
    }

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        int T = Integer.parseInt(br.readLine());

        for (int t=0; t<T; t++) {
            int n = Integer.parseInt(br.readLine());
            Trie trie = new Trie();

            String[] nums = new String[n];
            for (int i=0; i<n; i++) {
                nums[i] = br.readLine();
            }
            Arrays.sort(nums);

            boolean flag = true;

            for (String num : nums) {
                if (trie.contains(num)) {
                    sb.append("NO\n");
                    flag = false;
                    break;
                }
                trie.add(num);
            }

            if (flag) {
                sb.append("YES\n");
            }
        }

        System.out.print(sb);
    }
}

 

 

๊ฐ ํ…Œ์ŠคํŠธ์ผ€์ด์Šค๋งˆ๋‹ค ๋ฌธ์ž์—ด ๋ชฉ๋ก์ด ๋“ค์–ด์˜ค๋ฉด

1. ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ

2. ํŠธ๋ผ์ด์— ํ•ด๋‹น ๋ฌธ์ž์—ด์˜ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์ด ์กด์žฌํ•˜๋ฉด (isEnd = true์ธ ๋…ธ๋“œ ์กด์žฌ) "NO"๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  ๋ฉˆ์ถ˜๋‹ค.

3. ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ํŠธ๋ผ์ด์— ํ•ด๋‹น ๋ฌธ์ž์—ด์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

4. ๋ชจ๋“  ๋ฌธ์ž์—ด์˜ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์ด ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด "YES"๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.