๋ฌธ์ž์—ด์„ ํšจ์œจ์ ์œผ๋กœ ์ €์žฅํ•˜๊ณ  ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ํŠธ๋ฆฌ ๊ธฐ๋ฐ˜์˜ ์ž๋ฃŒ๊ตฌ์กฐ

์‚ฌ์ „๊ณผ ๊ฐ™์€ ๋‹จ์–ด ๊ฒ€์ƒ‰, ์ž๋™ ์™„์„ฑ, ์ ‘๋‘์‚ฌ ๋งค์นญ ๋“ฑ์— ์œ ์šฉํ•˜๋‹ค.

Pros

  • ๋ถˆ์™„์ „ํ•œ ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ•ด์‹œํ…Œ์ด๋ธ”๊ณผ ๋น„๊ตํ•  ๋•Œ, ์ž๋ฃŒ์— ์ ‘๊ทผํ•  ๋•Œ ์ตœ์•…์˜ ๊ฒฝ์šฐ ๋” ๋” ์œ ๋ฆฌํ•œ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š”๋‹ค. m์ด ํƒ์ƒ‰ํ•  ๋ฌธ์ž์—ด์˜ ๊ธธ์ด์ผ ๋•Œ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(m)์ด๋‹ค. ๋ณดํ†ต ํ•ด์‹œํ…Œ์ด๋ธ”์€ ํƒ์ƒ‰ ์‹œ๊ฐ„์ด O(1)์ด๊ณ  ํ•ด์‹œ ํ•จ์ˆ˜ ํ‰๊ฐ€ ์‹œ๊ฐ„์ด O(m)์ด์ง€๋งŒ, ๋ถˆ์™„์ „ํ•œ ํ•ด์‹œ ํ…Œ์ด๋ธ”์€ ํ‚ค ์ถฉ๋Œ์ด ์ผ์–ด๋‚  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ,ย O(N)์ด ๋  ์ˆ˜ ์žˆ๋‹ค.
  • ํŠธ๋ผ์ด์—์„œ๋Š” ํ‚ค ์ถฉ๋Œ์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค.
  • ์—ฌ๋Ÿฌ ๊ฐ’์ด ํ•˜๋‚˜์˜ ํ‚ค์™€ ์—ฐ๊ด€๋˜์–ด ์žˆ์ง€ ์•Š๋Š” ํ•œ ๋ฒ„ํ‚ท์ด ํ•„์š” ์—†๋‹ค.
  • ํ•ด์‹œ ํ•จ์ˆ˜๊ฐ€ ์—†์–ด๋„ ๋œ๋‹ค. ํ‚ค๊ฐ€ ๋Š˜์–ด๋‚  ๋•Œ ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•  ํ•„์š”๋„ ์—†๋‹ค.
  • ๋ชจ๋“  ํ•ญ๋ชฉ์ด ํ‚ค์— ๋”ฐ๋ผ ์‚ฌ์ „์ˆœ์œผ๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ๋‹ค.

Cons

  • ์กฐํšŒ๋Š” ํ•ด์‹œ ํ…Œ์ด๋ธ”๋ณด๋‹ค ๋А๋ฆด ์ˆ˜ ์žˆ๋‹ค. ํŠนํžˆ ์ฃผ ๋ฉ”๋ชจ๋ฆฌ์— ๋น„ํ•ด ์ž„์˜ ์ ‘๊ทผ ๋น„์šฉ์ด ํฐ ํ•˜๋“œ ๋””์Šคํฌ ๋“œ๋ผ์ด๋ธŒ์™€ ๊ฐ™์€ ๋ณด์กฐ ๊ธฐ์–ต์žฅ์น˜์—์„œ ์ง์ ‘ ์ฝ๋Š”๋‹ค๋ฉด ๋”์šฑ ๊ทธ๋ ‡๋‹ค
  • ๋ถ€๋™์†Œ์ˆ˜์ ๊ณผ ๊ฐ™์ด ๋ฌธ์ž์—ด๋กœ ์žฅํ™ฉํ•˜๊ฒŒ ํ‘œ์‹œ๋˜๋Š” ์ž๋ฃŒ์˜ ๊ฒฝ์šฐ ๋ฌด์˜๋ฏธํ•˜๊ฒŒ ๊ธธ๊ฒŒ ๋Š˜์–ด์ง„ ์ ‘๋‘์‚ฌ์™€ ๋…ธ๋“œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.
    • ํ‘œ์ค€ IEEE ๋ถ€๋™์†Œ์ˆ˜์  ์ˆ˜๋Š” ๋น„ํŠธ ํŠธ๋ผ์ด๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜๋Š” ์žˆ๋‹ค.
  • ํŠธ๋ผ์ด๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋” ์†Œ๋น„ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ํ•ด์‹œ ํ…Œ์ด๋ธ”์—์„œ๋Š” ์ „์ฒด ํ•ญ๋ชฉ์„ ํ•˜๋‚˜์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฒญํฌ์— ์˜ฌ๋ฆฌ๊ณค ํ•˜์ง€๋งŒ, ํŠธ๋ผ์ด์—์„œ๋Š” ๊ฒ€์ƒ‰ ๋ฌธ์ž์—ด์˜ ๊ฐ ๋ฌธ์ž๋งˆ๋‹ค ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ• ๋‹น๋  ์ˆ˜ ์žˆ๋‹ค.

Insert

|1000

  • ๋ฃจํŠธ ๋…ธ๋“œ์—์„œ ์‹œ์ž‘ํ•ด ๋ฌธ์ž์—ด์˜ ๊ฐ ๋ฌธ์ž๋ฅผ ํŠธ๋ฆฌ์˜ ๊นŠ์ด๋ฅผ ๋”ฐ๋ผ๊ฐ€๋ฉฐ ๋…ธํŠธ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
  • ๋ฌธ์ž์—ด์˜ ๊ฐ ๋ฌธ์ž์— ๋Œ€ํ•ด ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฉด ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , ์žˆ์œผ๋ฉด ๊ธฐ์กด ๋…ธ๋“œ๋ฅผ ๋”ฐ๋ผ๊ฐ„๋‹ค.
  • ๋ฌธ์ž์—ด์˜ ๋์— ๋„๋‹ฌํ•˜๋ฉด ํ•ด๋‹น ๋…ธ๋“œ์— endOfWord๋ฅผ true๋กœ ํ‘œ์‹œํ•œ๋‹ค

|1000

  • ๋ฃจํŠธ ๋…ธ๋“œ์—์„œ ์‹œ์ž‘ํ•ด ๋ฌธ์ž๋ฅผ ๋”ฐ๋ผ๊ฐ€๋‹ค ๋ชจ๋“  ๋ฌธ์ž๊ฐ€ ํŠธ๋ฆฌ์—์„œ ์ผ์น˜ํ•˜๋ฉด ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๊ฐ€ endOfWord ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
    • endOfWord๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋ฉด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ฌธ์ž์—ด์ด๋‹ค

Delete

|1000

  • ๋จผ์ € ๋ฌธ์ž์—ด์ด ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
  • ์กด์žฌํ•œ๋‹ค๋ฉด ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ์ธ endOfWord๋ฅผ false๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค. ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ์˜ ์ž์‹์ด ์žˆ๋‹ค๋ฉด ๋‚˜๋จธ์ง€ ๋…ธ๋“œ๋“ค์„ ์‚ญ์ œํ•˜์ง€ ์•Š๊ณ  ์—†๋‹ค๋ฉด ๋‹ค๋ฅธ ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์—†์„ ๋•Œ ๊นŒ์ง€ ์ƒ์œ„ ๋…ธ๋“œ๋กœ ์ด๋™ํ•˜๋ฉฐ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•œ๋‹ค.

Code

public class Trie {
 
    private class TrieNode {
        Map<Character, TrieNode> children = new HashMap<>();
        boolean isEndOfWord;
 
        public TrieNode() {
            this.isEndOfWord = false;
        }
    }
 
    private final TrieNode root;
 
    public Trie() {
        root = new TrieNode();
    }
 
    // insert
    public void insert(String word) {
        TrieNode current = root;
        for (char ch : word.toCharArray()) {
            current = current.children.computeIfAbsent(ch, c -> new TrieNode());
        }
        current.isEndOfWord = true;
    }
 
    // search
    public boolean search(String word) {
        TrieNode current = root;
        for (char ch : word.toCharArray()) {
            current = current.children.get(ch);
            if (current == null) {
                return false;
            }
        }
        return current.isEndOfWord;
    }
 
    // delete
    public void delete(String word) {
        delete(root, word, 0);
    }
 
    private boolean delete(TrieNode current, String word, int index) {
        if (index == word.length()) {
            if (!current.isEndOfWord) {
                return false;
            }
            current.isEndOfWord = false;
            return current.children.isEmpty();
        }
        char ch = word.charAt(index);
        TrieNode node = current.children.get(ch);
        if (node == null) {
            return false;
        }
        boolean shouldDeleteCurrentNode = delete(node, word, index + 1);
 
        if (shouldDeleteCurrentNode) {
            current.children.remove(ch);
            return current.children.isEmpty() && !current.isEndOfWord;
        }
        return false;
    }
 
    public static void main(String[] args) {
        Trie trie = new Trie();
 
        trie.insert("hello");
        trie.insert("helium");
 
        System.out.println(trie.search("hello")); // true
        System.out.println(trie.search("helix")); // false
 
        trie.delete("hello");
        System.out.println(trie.search("hello")); // false
        System.out.println(trie.search("helium")); // true
    }
}

Trie

ํŠธ๋ผ์ด(Trie) ๊ฐœ๋…, ์ง์ ‘ ๊ตฌํ˜„ํ•˜๊ธฐ