๊ด€๋ฆฌ ๋ฉ”๋‰ด

Daehyunii's Dev-blog

17 ํŠธ๋ฆฌ ์ˆœํšŒ ๋ณธ๋ฌธ

๐Ÿ“š Language & CS knowledge/Algorithm & Data structure

17 ํŠธ๋ฆฌ ์ˆœํšŒ

Daehyunii 2022. 8. 16. 20:16

17.1 ํŠธ๋ฆฌ ์ˆœํšŒ

  ํŠธ๋ฆฌ ์ˆœํšŒ๋Š” ๋ง ๊ทธ๋Œ€๋กœ ์–ด๋–ค ํŠธ๋ฆฌ์—์„œ๋“ ์ง€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐœ๋…์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ๋“ ์ง€, ๊ทธ๋ƒฅ ์ด์ง„ ํŠธ๋ฆฌ๋“ ์ง€ ๊ทธ ์™ธ์˜ ์–ด๋–ค ํŠธ๋ฆฌ๋“ค์—๋„ ๋‹ค ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•œ ์ˆœํšŒ ๋ฐฉ๋ฒ•์ด๋‹ค. ์ฆ‰ ํŠธ๋ฆฌ์˜ ํŠน์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด ํŠธ๋ฆฌ ์ˆœํšŒ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค. ํŠธ๋ฆฌ๋ฅผ ์ˆœํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ๋งŽ์€ ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•˜๊ณ  ๋Œ€ํ‘œ์ ์œผ๋กœ ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰(Breadth First Search)๊ณผ ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰(Deapth First Search)๊ฐ€ ์žˆ๋‹ค. ์–ด๋–ค ํƒ์ƒ‰ ๋ฐฉ๋ฒ•์ด๋“  ๋ชจ๋“  ๋…ธ๋“œ๋“ค์„ ์ˆœํšŒํ•˜๋Š” ๊ฒƒ์€ ๋™์ผํ•˜๋‹ค. 

 

17.2 ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰

  ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰(Breadth First Search)์€ ํŠธ๋ฆฌ์˜ ๊ฐ™์€ ๋ ˆ๋ฒจ์— ์žˆ๋Š” ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ๊ฐ€๋ฉฐ ์ˆœํšŒ๋ฅผ ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

/*
ํŠธ๋ฆฌ)

           10
         /    \ 
        6      15
       / \     / \
      3	  8  12   20

๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰) ๊ฐ™์€ ๋ ˆ๋ฒจ์˜ ๋…ธ๋“œ๋“ค์„ ๊ฑฐ์ณ๊ฐ€๋ฉด์„œ ํƒ์ƒ‰

	------>10
   --->6----------->15
  3----->8----->12----->20
  
*/

  ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰์„ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ํ ์ž๋ฃŒ ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•ด์•ผ ํ•œ๋‹ค.(์„ ์ž…์„ ์ถœ) ์ง์ ‘ ํ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด์„œ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋ฐฐ์—ด์„ ํ™œ์šฉํ•ด์„œ ํ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๊ตฌํ˜„ํ•˜๊ธฐ ๋” ํŽธ๋ฆฌํ•˜๋‹ค.

 

โ—Ž์ˆ˜๋„์ฝ”๋“œ

1) ๋จผ์ € ๋ณ€์ˆ˜ ๋‘ ๊ฐœ๋ฅผ ๋งŒ๋“ ๋‹ค.

2) ํ๋ฅผ ๋งŒ๋“ค์–ด์„œ ์š”์†Œ๋“ค์„ ์ถ”์ ํ•˜๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๋Š” ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์„œ ๋งˆ์ง€๋ง‰์— ๋ฐ˜ํ™˜ํ•ด ์ค€๋‹ค.

์ฆ‰, ๋งˆ์ง€๋ง‰์— ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์€ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , ํ๋Š” ๋งˆ์ง€๋ง‰์—๋Š” ๋น„์–ด ์žˆ๋Š” ๋ฐฐ์—ด ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.(ํ ๋ฐฐ์—ด์€ ๊ทธ๋ƒฅ ๋„์™€์ฃผ๋Š” ์—ญํ• ์ž„)

3) ์ฒ˜์Œ์—๋Š” ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ํ ๋ฐฐ์—ด์— ๋„ฃ๊ณ , ํ ๋ฐฐ์—ด์— ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ณ„์† ๋ฃจํ”„๋ฅผ ๋Œ๋ฆฐ๋‹ค.

4) ๊ทธ๋ฆฌ๊ณ  ํ์—์„œ ๋””ํ๋ฅผ ํ•œ๋‹ค. ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•ด์„œ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ์—๋Š” shift() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ ๋ฐฐ์—ด์˜ ๋งจ ์•ž์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ฑฐ ํ•œ๋‹ค.

5) ๊ทธ๋ฆฌ๊ณ  ์ œ๊ฑฐํ•œ ๋…ธ๋“œ์˜ ๊ฐ’์„ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๋Š” ๋ฐฐ์—ด์— ์ถ”๊ฐ€ํ•ด ์ค€๋‹ค.

6) ๊ทธ๋ฆฌ๊ณ  ์ œ๊ฑฐ๋œ ๋…ธ๋“œ์˜ ์™ผ์ชฝ/์˜ค๋ฅธ์ชฝ์— ๋…ธ๋“œ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ๋…ธ๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ํ ๋ฐฐ์—ด์— ๋‹ด๋Š”๋‹ค.

7) ๋ชจ๋“  ๋ฃจํ”„๊ฐ€ ๋๋‚œ ๋‹ค์Œ์—๋Š” ๋ชจ๋“  ๋…ธ๋“œ์˜ ๊ฐ’๋“ค์„ ์ €์žฅํ•œ ๋ณ€์ˆ˜๋ฅผ ์ถœ๋ ฅํ•ด ์ค€๋‹ค.

 

class Node {
    constructor(value){
        this.value = value;
        this.left = null;
        this.right = null;
    }
}

class BinarySearchTree {
    constructor(){
        this.root = null;
    }
    insert(value){
        var newNode = new Node(value);
        if(this.root === null){
            this.root = newNode;
            return this;
        }
        var current = this.root;
        while(true){
            if(value === current.value) return undefined;
            if(value < current.value){
                if(current.left === null){
                    current.left = newNode;
                    return this;
                }
                current = current.left;
            } else {
                if(current.right === null){
                    current.right = newNode;
                    return this;
                } 
                current = current.right;
            }
        }
    }
    
    find(value){
        if(this.root === null) return false;
        var current = this.root,
            found = false;
        while(current && !found){
            if(value < current.value){
                current = current.left;
            } else if(value > current.value){
                current = current.right;
            } else {
                found = true;
            }
        }
        if(!found) return undefined;
        return current;
    }

    BFS(){
        var node = this.root,
            data = [],
            queue = [];
        queue.push(node); 

        while(queue.length){ //๋นˆ ๋ฐฐ์—ด์„ ๋ฌด์กฐ๊ฑด true๊ฐ€ ๋‚˜์™€์„œ length๋ฅผ ์ด์šฉ
           node = queue.shift(); // shift ์›๋ณธ ๋ฐฐ์—ด ์ง์ ‘ ๋ณ€๊ฒฝ(ํ ๋ฐฐ์—ด์—์„œ ์ œ๊ฑฐ๋จ)
           data.push(node.value); // push ์›๋ณธ ๋ฐฐ์—ด ์ง์ ‘ ๋ณ€๊ฒฝ(๋ฐ์ดํƒ€ ๋ฐฐ์—ด์— ์ถ”๊ฐ€๋จ)
           if(node.left) queue.push(node.left);
           if(node.right) queue.push(node.right);
        }
        return data;    
    }
}

17.3 ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰

  ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰์€ ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰ ์ฒ˜๋Ÿผ ํ˜•์ œ๋…ธ๋“œ๋ฅผ ๋‹ค ๊ฑฐ์ณ๊ฐ€๋ฉด์„œ ํƒ์ƒ‰ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์ˆ˜์ง์œผ๋กœ ํŠธ๋ฆฌ์˜ ๋๊นŒ์ง€ ๋‚ด๋ ค๊ฐ€๋ฉด์„œ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰์€ ์ˆœํšŒ์‹œ ์ˆœํšŒ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฐ์—ด์— ์–ธ์ œ ์ˆœํšŒ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ• ์ง€์— ๋”ฐ๋ผ ์ „์œ„ ์ˆœํšŒ, ํ›„์œ„ ์ˆœํšŒ, ์ค‘์œ„ ์ˆœํšŒ๋กœ ๋‚˜๋‰  ์ˆ˜ ์žˆ๋‹ค.

 

โ—Ž์ˆ˜๋„์ฝ”๋“œ

1) ์ˆœํšŒ์‹œ ํ™•์ธ์„ ํ•œ ๋…ธ๋“œ๋“ค์˜ ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๋ฐฐ์—ด์„ ๋งŒ๋“ ๋‹ค.

2) ๋งจ ๋งˆ์ง€๋ง‰์—๋Š” ๊ฐ’์„ ์ €์žฅํ•œ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

3) ํ˜„์žฌ ํ™•์ธํ•˜๊ณ  ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ ์—ญํ• ์„ ํ•  ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ์ค€๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํŠธ๋ฆฌ์˜ ๋ฃจํŠธ๋…ธ๋“œ๋ฅผ ํ• ๋‹นํ•œ๋‹ค.

4) ์ด์ œ ํ—ฌํผ ํ•จ์ˆ˜์ธ ์ค‘์ฒฉ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ ๋‹ค. 

5) ์ด์ œ ๋…ธ๋“œ๋“ค์„ ๋ฐฉ๋ฌธํ•ด์„œ ๋…ธ๋“œ๋“ค์˜ ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๋ฐฐ์—ด์— ๊ฐ’์„ ์ถ”๊ฐ€ํ•ด ์ค€๋‹ค.

6) ๊ทธ๋ฆฌ๊ณ  ํ™•์ธํ•œ ๋…ธ๋“œ๊ฐ€ ์™ผ์ชฝ/์˜ค๋ฅธ์ชฝ ํ”„๋กœํผํ‹ฐ์— ๋…ธ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด ์žฌ๊ท€ ๋ฐฉ์‹์œผ๋กœ ํ—ฌํผ ํ•จ์ˆ˜๋ฅผ ๋‹ค์‹œ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

 

class Node {
    constructor(value){
        this.value = value;
        this.left = null;
        this.right = null;
    }
}

class BinarySearchTree {
    constructor(){
        this.root = null;
    }
    insert(value){
        var newNode = new Node(value);
        if(this.root === null){
            this.root = newNode;
            return this;
        }
        var current = this.root;
        while(true){
            if(value === current.value) return undefined;
            if(value < current.value){
                if(current.left === null){
                    current.left = newNode;
                    return this;
                }
                current = current.left;
            } else {
                if(current.right === null){
                    current.right = newNode;
                    return this;
                } 
                current = current.right;
            }
        }
    }
    find(value){
        if(this.root === null) return false;
        var current = this.root,
            found = false;
        while(current && !found){
            if(value < current.value){
                current = current.left;
            } else if(value > current.value){
                current = current.right;
            } else {
                found = true;
            }
        }
        if(!found) return undefined;
        return current;
    }

    DFSPreOrder(){ //์ „์œ„
        var data = [];
        function traverse(node){
            data.push(node.value); // <--ํ•ด๋‹น ์ฝ”๋“œ์˜ ์œ„์น˜์— ๋”ฐ๋ผ dfs์˜ ์œ ํ˜•์ด ๋‹ฌ๋ผ์ง„๋‹ค.
            if(node.left) traverse(node.left);
            if(node.right) traverse(node.right);
        }
        traverse(this.root);
        return data;
    }
    DFSPostOrder(){ //ํ›„์œ„
        var data = [];
        function traverse(node){
            if(node.left) traverse(node.left);
            if(node.right) traverse(node.right);
            data.push(node.value); // <--ํ•ด๋‹น ์ฝ”๋“œ์˜ ์œ„์น˜์— ๋”ฐ๋ผ dfs์˜ ์œ ํ˜•์ด ๋‹ฌ๋ผ์ง„๋‹ค.
        }
        traverse(this.root);
        return data;
    }
    DFSInOrder(){ //์ค‘์œ„
        var data = [];
        function traverse(node){
            if(node.left) traverse(node.left);
            data.push(node.value); // <--ํ•ด๋‹น ์ฝ”๋“œ์˜ ์œ„์น˜์— ๋”ฐ๋ผ dfs์˜ ์œ ํ˜•์ด ๋‹ฌ๋ผ์ง„๋‹ค.
            if(node.right) traverse(node.right);
        }
        traverse(this.root);
        return data;
    }
}

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