์ง€๋‚œ๋ฒˆ์— ํŠธ๋ผ์ด๋ฅผ ๊ณต๋ถ€ํ•˜๊ณ  ํฌ์ŠคํŒ…์œผ๋กœ ์ •๋ฆฌํ–ˆ๋Š”๋ฐ, ์•„๋ž˜ ํฌ์ŠคํŒ…์—์„œ๋Š” Map Interface๋กœ ๊ตฌํ˜„์„ ํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ๋ฐฑ์ค€ - ์ „์„ค(19585)์„ ํŠธ๋ผ์ด ์ž๋ฃŒ๊ตฌ์กฐ๋กœ ํ’€์–ด๋„ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋‚˜๊ธธ๋ž˜ ๋” ์ฐพ์•„๋ณด๋‹ˆ Array๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ์‹๋„ ์žˆ์–ด์„œ ์ด๋ฒˆ์—๋Š” Array ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•œ ํŠธ๋ผ์ด๋„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.


ํŠธ๋ผ์ด(Trie)๋ž€?

ํŠธ๋ผ์ด(Trie)๋Š” ๋ฌธ์ž์—ด์„ ์ €์žฅํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜๊ธฐ ์œ„ํ•œ ํŠธ๋ฆฌ ํ˜•ํƒœ์˜ ์ž๋ฃŒ๊ตฌ์กฐ๋กœ, ์ž์„ธํ•œ๊ฑด ์ง€๋‚œ๋ฒˆ ํฌ์ŠคํŒ…์„ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”.

 

[์ž๋ฃŒ๊ตฌ์กฐ] ํŠธ๋ผ์ด(Trie)

1. ํŠธ๋ผ์ด(Trie)๋ž€?์›ํ•˜๋Š” ์š”์†Œ๋ฅผ ์ฐพ๊ธฐ์œ„ํ•ด ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ ๋“ฑ์—์„œ๋Š” ํƒ€๊ฒŸ ์š”์†Œ๋ฅผ ์ฐพ๋Š”๋ฐ์— O(logN)์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ๋ฌธ์ž์—ด์˜ ๊ฒฝ์šฐ ๋‘ ๋ฌธ์ž์—ด์„ ๋น„๊ตํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฌธ์ž์—ด

coding-vvon.tistory.com

 

ํŠธ๋ผ์ด(Trie) ๊ตฌํ˜„ ๋ฐฉ์‹

ํŠธ๋ผ์ด(Trie)๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. Array๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„
  2. Map Interface๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„

Array๋กœ ๊ตฌํ˜„ํ•  ๊ฒฝ์šฐ, ๋น ๋ฅธ ์ €์žฅ๊ณผ ํƒ์ƒ‰์„ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์ง€๋งŒ ํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ์˜ ํฌ๊ธฐ๊ฐ€ ๋„ˆ๋ฌด ํฌ๋‹ค๋Š” ๊ฒƒ์ด ๋‹จ์ ์ž…๋‹ˆ๋‹ค.

Map Interface๋กœ ๊ตฌํ˜„ํ•  ๊ฒฝ์šฐ, ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋™์ ์œผ๋กœ ํ• ๋‹นํ•˜์—ฌ ํ•„์š” ๋…ธ๋“œ๋งŒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์ง€๋งŒ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ตœ์ ํ™” ์ž‘์—…์ด ๊ฝค ๊นŒ๋‹ค๋กญ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

1. Array๋กœ ๊ตฌํ˜„

Array๋กœ ๊ตฌํ˜„ํ•  ๊ฒฝ์šฐ, Trie์˜ Node๋ณ„ ์ž์‹ ๋…ธ๋“œ๋ฅผ Nodeํ˜• ๋ฐฐ์—ด๋กœ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. 

์ด๋•Œ, Trie Node์— ๋“ค์–ด๊ฐ€๋Š” ๋‹จ์–ด๋Š” ์˜์–ด ์†Œ๋ฌธ์ž๋งŒ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉฐ, ๊ฐ ๋…ธ๋“œ๋Š” ์˜์–ด ์†Œ๋ฌธ์ž๋ฅผ ์ •์ˆ˜ํ˜•(int)์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ธ๋ฑ์Šค๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

* ์ž์„ธํ•œ ์„ค๋ช…์€ ์ด์ „ ํฌ์ŠคํŒ…์„ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”.

 

[์ž๋ฃŒ๊ตฌ์กฐ] ํŠธ๋ผ์ด(Trie)

1. ํŠธ๋ผ์ด(Trie)๋ž€?์›ํ•˜๋Š” ์š”์†Œ๋ฅผ ์ฐพ๊ธฐ์œ„ํ•ด ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ ๋“ฑ์—์„œ๋Š” ํƒ€๊ฒŸ ์š”์†Œ๋ฅผ ์ฐพ๋Š”๋ฐ์— O(logN)์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ๋ฌธ์ž์—ด์˜ ๊ฒฝ์šฐ ๋‘ ๋ฌธ์ž์—ด์„ ๋น„๊ตํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฌธ์ž์—ด

coding-vvon.tistory.com

 

Node ํด๋ž˜์Šค ์ƒ์„ฑ

Map์œผ๋กœ ๊ตฌํ˜„ํ•œ Trie ์˜ Node์™€ ๋‹ค๋ฅด๊ฒŒ ์ž์‹ ๋…ธ๋“œ๋ฅผ Node[] ๋กœ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

childNode์˜ ์ธ๋ฑ์Šค์— ์˜์–ด ์†Œ๋ฌธ์ž๋ฅผ ์ •์ˆ˜ํ˜•(int)๋กœ ๋ณ€ํ™˜ํ•œ ๊ฐ’์ด ๋“ค์–ด๊ฐ€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ž์‹ ๋…ธ๋“œ์˜ ์ˆ˜(childCnt)์™€ ํ•ด๋‹น ๋…ธ๋“œ์˜ ๋ฌธ์ž(val)๋„ ์ €์žฅํ•ด์ค๋‹ˆ๋‹ค.

static final int SIZE = 26; // ์˜์–ด ์†Œ๋ฌธ์ž๋Š” 26์ž
private class Node {
    Node[] childNode = new Node[SIZE]; // ์ž์‹ ๋…ธ๋“œ: ์˜์–ด ์†Œ๋ฌธ์ž๋ฅผ ์ธ๋ฑ์Šคํ™” ํ•˜์—ฌ ์ €์žฅ
    boolean endOfWord; // ๋‹จ์–ด์˜ ๋์ธ์ง€์— ๋Œ€ํ•œ ํ”Œ๋ž˜๊ทธ
    int childCnt = 0; // ์ž์‹ ๋…ธ๋“œ ์ˆ˜
    char val; // ๋…ธ๋“œ์˜ ๋ฌธ์ž
}

 

ํŠธ๋ผ์ด(Trie) ์ž๋ฃŒ๊ตฌ์กฐ ํด๋ž˜์Šค ์ƒ์„ฑ

public class TrieArray {
    private Node rootNode;
    public TrieArray() {
    	rootNode = new Node();
    }
}

๊ธฐ๋ณธ ๋ฉ”์„œ๋“œ

1) ๋…ธ๋“œ ์ถ”๊ฐ€(insert)

๋ฌธ์ž์—ด์˜ ๋ฌธ์ž๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ ํ•ด๋‹น ๋ฌธ์ž๊ฐ€ ์ž์‹๋…ธ๋“œ๋กœ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์—ฌ ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค. 

Map์œผ๋กœ ๊ตฌํ˜„ํ–ˆ์„๋•Œ์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ํ˜„ ๋…ธ๋“œ์˜ ์ž์‹ ๋…ธ๋“œ๊ฐ€ null ์ด ์•„๋‹Œ์ง€, ์ฆ‰, ์ƒ์„ฑ๋˜์–ด์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•˜์—ฌ, ์—†๋‹ค๋ฉด ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. 

์ƒ์„ฑ์‹œ์—๋Š” ์ž์‹ ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , ์ž์‹ ๋…ธ๋“œ์˜ ๋ฌธ์ž๋ฅผ ํ• ๋‹นํ•ด์ฃผ๊ณ , ํ˜„ ๋…ธ๋“œ์˜ ์ž์‹ ๋…ธ๋“œ ์ˆ˜๋ฅผ ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค.

public void insert(String word) {
    Node node = this.rootNode;
    // ๋‹จ์–ด์˜ ๋ฌธ์ž๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ ์ž์‹ ๋…ธ๋“œ ํ™•์ธ
    for (int i=0; i < word.length(); i++) {
        char c = word.charAt(i);
        // ๋‹จ์–ด์˜ ํŠน์ • ๋ฌธ์ž๋ฅผ ์ธ๋ฑ์Šค(int)๋กœ ๋ณ€ํ™˜
        int intVal = charToInt(c);
        // ํ˜„ ๋…ธ๋“œ์— ์ธ๋ฑ์Šค๋กœ ๋ณ€ํ™˜ํ•œ ๋ฌธ์ž๊ฐ€ ์ž์‹๋…ธ๋“œ๋กœ ์žˆ๋Š”์ง€ ํ™•์ธ
        if (node.childNode[intVal] == null) {
            // ์ž์‹ ๋…ธ๋“œ์— ์—†๋Š” ๋ฌธ์ž๋ผ๋ฉด ์ƒˆ๋กœ ์ƒ์„ฑ
            node.childNode[intVal] = new Node();
            node.childNode[intVal].val = c;
            node.childCnt++;
        }
        // ๋‹ค์Œ ํƒ์ƒ‰ ๋…ธ๋“œ๋ฅผ ์ž์‹๋…ธ๋“œ๋กœ ๋ณ€๊ฒฝ
        node = node.childNode[intVal];
    }
    node.endOfWord = true; // ๋‹จ์–ด(word)์˜ ๋ฌธ์ž๋ฅผ ๋ชจ๋‘ ์ˆœํšŒํ•˜๋ฉด ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋Š” ๋ฆฌํ”„ ๋…ธ๋“œ(=๋งˆ์ง€๋ง‰ ๋ฌธ์ž)์ด๊ธฐ๋•Œ๋ฌธ์— endOfWord๋ฅผ true๋กœ ์„ค์ •
}

2) ํฌํ•จ ์—ฌ๋ถ€ ํ™•์ธ(contains)

๋ฌธ์ž์—ด์ด ํŠธ๋ผ์ด์— ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฉ”์„œ๋“œ๋กœ, ๋ฐฐ์—ด ๋ฐฉ์‹์— ๋งž๊ฒŒ ๊ตฌํ˜„ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

public boolean contains(String word) {
    Node node = this.rootNode;
    char c;
    for (int i=0; i<word.length(); i++) {
        c = word.charAt(i);
        int intVal = charToInt(c); // ๋ฌธ์ž๋ฅผ ์ธ๋ฑ์Šค๋กœ ๋ณ€ํ™˜
        if (node.childNode[intVal] == null) return false; // ํ˜„์žฌ ํƒ์ƒ‰ํ•˜๋Š” ๋ฌธ์ž๊ฐ€ ์ž์‹ ๋…ธ๋“œ์— ์—†๋‹ค๋ฉด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋‹จ์–ด
        node = node.childNode[intVal];
    }
    return node != null && node.endOfWord; // ๋งˆ์ง€๋ง‰ ๋ฌธ์ž ์—ฌ๋ถ€๋ฅผ ๋ฐ˜ํ™˜
}

3) ๋…ธ๋“œ ์‚ญ์ œ(delete)

ํŠธ๋ผ์ด์— ์กด์žฌํ•˜๋Š” ๋ฌธ์ž์—ด์„ ์‚ญ์ œํ•˜๋Š” ๋ฉ”์„œ๋“œ๋กœ, ์‚ญ์ œ ์กฐ๊ฑด์— ๋งž์ถฐ ๋ฐฐ์—ด ๋ฐฉ์‹์— ๋งž๊ฒŒ ๊ตฌํ˜„ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

public void delete(String word) {
    delete(this.rootNode, word, 0);
}
// ์žฌ๊ท€ ํ˜ธ์ถœ์„ ์œ„ํ•œ ํ•จ์ˆ˜ ์˜ค๋ฒ„๋กœ๋”ฉ
public void delete(Node node, String word, int idx) {
    // ๋‹จ์–ด์˜ ๋งˆ์ง€๋ง‰์ธ ๊ฒฝ์šฐ
    if (idx == word.length()) {
        if (!node.endOfWord) throw new Error(word + " not exist"); // ๋‹จ์–ด๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์Œ
        node.endOfWord = false; // ๋‹จ์–ด์˜ ๋ ๋ฌธ์ž ํ‘œ์‹œ๋ฅผ false๋กœ ๋ณ€๊ฒฝ: ํ•ด๋‹น ๋ฌธ์ž ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•˜๊ธฐ ์œ„ํ•จ
        return; // ๋ฆฌํ”„ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ ๋…ธ๋“œ๋กœ return
    } else {
        if (node.childCnt == 0) throw new Error(word + " not exist"); // ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ(=๋‹จ์–ด๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ)
    }

    char c = word.charAt(idx); // ํ˜„์žฌ ํ™•์ธํ•ด์•ผํ•˜๋Š” ๋ฌธ์ž
    int intVal = charToInt(c); // ๋ฌธ์ž๋ฅผ ์ธ๋ฑ์Šค๋กœ ๋ณ€ํ™˜

    Node child = node.childNode[intVal]; // ์ž์‹ ๋…ธ๋“œ ๊ฐ€์ ธ์˜ค๊ธฐ
    // ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด ๋ฆฌํ”„ ๋…ธ๋“œ๊นŒ์ง€ ๋‚ด๋ ค๊ฐ€์•ผ ํ•˜๋ฏ€๋กœ ์žฌ๊ท€ ํ˜ธ์ถœ
    delete(child, word, idx+1);
    // ํ˜„ ๋…ธ๋“œ์˜ ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์‚ญ์ œ๋˜์—ˆ๋‹ค๋ฉด, ํ˜„ ๋…ธ๋“œ์˜ ์ž์‹ ๋…ธ๋“œ ์ˆ˜ 1 ์ฐจ๊ฐ
    if (node.childNode[intVal] == null) node.childCnt--;
    // ํ˜„ ๋…ธ๋“œ์˜ ์ž์‹ ๋…ธ๋“œ๊ฐ€ ๋ฆฌํ”„ ๋…ธ๋“œ์ด๊ณ (=์ž์‹ ๋…ธ๋“œ๊ฐ€ ์—†์Œ), ๋‹จ์–ด์˜ ๋์ธ ๋ฌธ์ž๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ์‚ญ์ œ
    if (child.childCnt == 0 && !node.endOfWord) node = null;
}

 

๐Ÿงช ๊ตฌํ˜„ ํ…Œ์ŠคํŠธ

๊ตฌํ˜„ ํ…Œ์ŠคํŠธ๋Š” Map ๋ฐฉ์‹๊ณผ ๋™์ผํ•˜๋‹ˆ, ํ•ด๋‹น ํฌ์ŠคํŒ…์„ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š” :)

 

๐Ÿ’ก ์ „์ฒด ์ฝ”๋“œ(Array๋กœ ๊ตฌํ˜„)๋Š” ์•„๋ž˜ ๋งํฌ์—์„œ ํ™•์ธํ•ด์ฃผ์„ธ์š”.

 

Algorithm/src/Trie/TrieArray.java at main · hywnj/Algorithm

Contribute to hywnj/Algorithm development by creating an account on GitHub.

github.com

 

2. Map Interface๋กœ ๊ตฌํ˜„

์•„๋ž˜ ์ฝ”๋“œ๋Š” Map Interface๋กœ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ์ด๋ฉฐ, ์ž์„ธํ•œ ์„ค๋ช…์€ ์ด์ „ ํฌ์ŠคํŒ…์„ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”.

 

[์ž๋ฃŒ๊ตฌ์กฐ] ํŠธ๋ผ์ด(Trie)

1. ํŠธ๋ผ์ด(Trie)๋ž€?์›ํ•˜๋Š” ์š”์†Œ๋ฅผ ์ฐพ๊ธฐ์œ„ํ•ด ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ ๋“ฑ์—์„œ๋Š” ํƒ€๊ฒŸ ์š”์†Œ๋ฅผ ์ฐพ๋Š”๋ฐ์— O(logN)์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ๋ฌธ์ž์—ด์˜ ๊ฒฝ์šฐ ๋‘ ๋ฌธ์ž์—ด์„ ๋น„๊ตํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฌธ์ž์—ด

coding-vvon.tistory.com

 

 

๐Ÿ’ก Trie๋ฅผ Map, Array๋กœ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋Š” ์•„๋ž˜ ๋งํฌ์—์„œ ํ™•์ธํ•ด์ฃผ์„ธ์š”.

 

Algorithm/src/Trie at main · hywnj/Algorithm

Contribute to hywnj/Algorithm development by creating an account on GitHub.

github.com

 

Reference

 

[์ž๋ฃŒ๊ตฌ์กฐ | Java] Trie(ํŠธ๋ผ์ด)

์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” ์ž๋ฃŒ๊ตฌ์กฐ ํŠธ๋ผ์ด์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. 1. ํŠธ๋ผ์ด(Trie)๋ž€? ํšจ์œจ์ ์ธ ๋ฌธ์ž์—ด ์ €์žฅ ๋ฐ ํƒ์ƒ‰์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ๋งŒ๋“  ์ž๋ฃŒ๊ตฌ์กฐ ํ˜•ํƒœ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์ฝ”๋”ฉ์„ ํ•˜๋‹ค ๋ณด๋ฉด ์ˆ˜๋งŽ์€ ๋ฌธ

cdragon.tistory.com

+ Recent posts