우규이인우윀
Eager To Learn 🌌
우규이인우윀
전체 방문자
였늘
μ–΄μ œ

λΈ”λ‘œκ·Έ 메뉴

  • 🏑 ν™ˆ
  • πŸš€ κΉƒν—ˆλΈŒ
  • β›… νƒœκ·Έ ν΄λΌμš°λ“œ
  • λΆ„λ₯˜ 전체보기 (217)
    • πŸ‘¨πŸ»‍πŸ’» PS (170)
      • JAVA (82)
      • MYSQL (1)
      • Docker (2)
      • PYTHON (24)
      • LeetCode 150 (39)
      • Algorithm 기법 (1)
      • 바킹독 (21)
    • λΈ”λ‘œκ·Έ 이사 (0)
    • Error (1)
    • CS (15)
      • DataBase (2)
      • OS (7)
      • Network (1)
      • Spring (1)
      • 자료ꡬ쑰 (3)
      • Java (1)
    • Learned (7)
      • Spring (7)
    • κ°œλ°œμ„œμ  (15)
      • 가상 λ©΄μ ‘ μ‚¬λ‘€λ‘œ λ°°μš°λŠ” λŒ€κ·œλͺ¨ μ‹œμŠ€ν…œ 섀계 기초 (1)
      • 였브젝트 - 쑰영호 (7)
      • μΉœμ ˆν•œ SQL νŠœλ‹ (7)
    • 회고 (2)
hELLO Β· Designed By μ •μƒμš°.
우규이인우윀

Eager To Learn 🌌

πŸ‘¨πŸ»‍πŸ’» PS/LeetCode 150

[Java] 208. Implement Trie (Prefix Tree)

2023. 9. 12. 09:22

문제 νŒŒμ•…

Trie 자료ꡬ쑰λ₯Ό κ΅¬ν˜„ν•΄μ•Όν•˜λŠ” λ¬Έμ œμ΄λ‹€.

 

νŠΈλΌμ΄λŠ” λ¬Έμžμ—΄μ„ μ €μž₯ν•˜κ³  효율적으둜 νƒμƒ‰ν•˜κΈ° μœ„ν•œ 트리 ν˜•νƒœμ˜ μžλ£Œκ΅¬μ‘°μ΄λ‹€.

ν•΄μ‹œ ν…Œμ΄λΈ”μ„ μ‚¬μš©ν•˜λ©΄ λ˜λŠ”λ°, μ™œ 트라이λ₯Ό μ‚¬μš©ν•΄μ•Όν• κΉŒ?

🚨 ν•΄μ‹œ ν…Œμ΄λΈ”μ˜ 경우 μ ‘λ‘μ‚¬λ‚˜ λΆ€λΆ„ λ¬Έμžμ—΄λ‘œ κ²€μƒ‰ν•˜κΈ° νž˜λ“€λ‹€. λ˜ν•œ, ν•΄μ‹œ μ½”λ“œλ‘œ μ €μž₯ν•˜κΈ° λ•Œλ¬Έμ— μ •λ ¬λ˜μ–΄ μžˆμ§€ μ•Šλ‹€.

 


풀이

1️⃣ 

Node 클래슀 μ •μ˜

class Trie {
    
    Node root;

    static class Node {
        Map<Character, Node> children;
        boolean isEndOfWord;

        public Node() {
            this.children = new HashMap<>();
            this.isEndOfWord = false;
        }
    }

    public Trie() {
        this.root = new Node();
    }

}

 

Trie μžλ£Œκ΅¬μ‘°λŠ” 트리 ν˜•νƒœμ΄κΈ° λ•Œλ¬Έμ—, λ…Έλ“œμ™€ λ…Έλ“œκ°„μ˜ μ—°κ²°λ‘œ ν‘œν˜„ν•΄μ•Όν•œλ‹€.

 

λ”°λΌμ„œ, Node 클래슀λ₯Ό μ •μ˜ν•΄μ€€λ‹€.

 

 

insert κ΅¬ν˜„

    public void insert(String word) {
        insert(this.root, word);
    }

    private void insert(Node node, String word) {
        if (word.length() == 0) {
            node.isEndOfWord = true;
            return;
        }

        char c = word.charAt(0);
        Node child;
        if (!node.children.containsKey(c)) {
            child = new Node();
            node.children.put(c, child);
        } else {
            child = node.children.get(c);
        }

        insert(child, word.substring(1));
    }

μž…λ ₯ν•˜λŠ” λ¬Έμžμ—΄μ„ 문자둜 μͺΌκ°œμ–΄ κ΄€λ¦¬ν•œλ‹€.

 

더이상 λ¬Έμžμ—΄μ΄ 없을 λ•ŒκΉŒμ§€ μž¬κ·€μ μœΌλ‘œ λ™μž‘ν•˜κ³ , λ¬Έμžμ—΄μ΄ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 경우 isEndOfWord ν•„λ“œλ₯Ό true둜 μ„€μ •ν•˜κ³  λΉ μ Έλ‚˜μ˜¨λ‹€.

 

 

search κ΅¬ν˜„

    public boolean search(String word) {
        return search(this.root, word);
    }

    private boolean search(Node node, String word) {
        if (word.length() == 0) {
            return node.isEndOfWord;
        }

        char c = word.charAt(0);
        if (!node.children.containsKey(c)) {
            return false;
        }
        
        return search(node.children.get(c), word.substring(1));
    }

insert 와 λΉ„μŠ·ν•˜λ‹€.

 

λ¬Έμžμ—΄μ„ 문자둜 μͺΌκ°  ν›„, 각 λ¬Έμžμ— ν•΄λ‹Ήν•˜λŠ” ν‚€ κ°’μœΌλ‘œν•˜λŠ” λ…Έλ“œλ₯Ό μ°Ύμ•„κ°„λ‹€.

 

λ§Œμ•½, ν‚€ κ°’μœΌλ‘œ ν•˜λŠ” λ…Έλ“œκ°€ null 인경우 falseλ₯Ό λ°˜ν™˜ν•œλ‹€.

 

startsWith κ΅¬ν˜„

    public boolean startsWith(String prefix) {
        Node currentNode = this.root;
        for (char c : prefix.toCharArray()) {
            if (!currentNode.children.containsKey(c)) {
                return false;
            }
            currentNode = currentNode.children.get(c);
        }

        return true;
    }

 

κ²€μƒ‰ν•˜λ €λŠ” 접두어λ₯Ό 문자둜 μͺΌκ°  λ’€, μžμ‹ λ…Έλ“œκ°€ ν•΄λ‹Ή 문자λ₯Ό ν‚€κ°’μœΌλ‘œ ν•˜λŠ” λ…Έλ“œλ₯Ό κ°–λŠ”μ§€ κ²€μ‚¬ν•˜λŠ” 과정이닀.

 

 

 

κ²°κ³Ό

 


πŸ“– 회고

Trie λΌλŠ” μžλ£Œκ΅¬μ‘°κ°€ μžˆλ‹€λŠ” 것을 κ°•μ˜λ₯Ό 톡해 처음 μ•Œκ²Œ λ˜μ—ˆμ—ˆλŠ”λ°

 

μ΄λ ‡κ²Œ λ°”λ‘œ μžλ£Œκ΅¬μ‘°λ‘œμ„œ κ΅¬ν˜„ν•˜λŠ” 문제λ₯Ό 직접 ν’€μ–΄λ³΄λ‹ˆ, Trie μžλ£Œκ΅¬μ‘°μ— λŒ€ν•΄ 더 κΉŠμ€ 이해λ₯Ό ν•  수 μžˆμ—ˆλ˜ 것 κ°™λ‹€.

 

ν•œλ²ˆ ν•΄λ΄€λ‹€κ³  끝낼 것이 μ•„λ‹ˆλΌ, 이 문제λ₯Ό μ—¬λŸ¬λ²ˆ ν’€μ–΄λ΄μ•Όκ² λ‹€λŠ” 생각이 λ“€μ—ˆλ‹€.

    'πŸ‘¨πŸ»‍πŸ’» PS/LeetCode 150' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
    • [Java] 212. Word Search II
    • [Java] 211. Design Add and Search Words Data Structure
    • [Java] 637. Average of Levels in Binary Tree
    • [Java] 199. Binary Tree Right Side View
    우규이인우윀
    우규이인우윀
    개발자 κΏˆλ‚˜λ¬΄

    ν‹°μŠ€ν† λ¦¬νˆ΄λ°”