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

Daehyunii's Dev-blog

15 ์Šคํƒ & ํ ๋ณธ๋ฌธ

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

15 ์Šคํƒ & ํ

Daehyunii 2022. 8. 14. 15:54

15.1 ์Šคํƒ(Stack)

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

 

15.2 ๋ฐฐ์—ด๋กœ ์Šคํƒ ๊ตฌํ˜„ํ•˜๊ธฐ

  ๋ฐฐ์—ด์„ ๋งŒ๋“ค๊ณ  ํ•ด๋‹น ๋ฐฐ์—ด์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ push() ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•˜๊ณ , ์ œ๊ฑฐํ•  ๋•Œ pop() ๋ฉ”์„œ๋“œ๋งŒ์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ shift(), unshift() ๋ฉ”์„œ๋“œ๋งŒ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋ฐฐ์—ด์„ ์Šคํƒ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋œ๋‹ค. ํ›„์ž…์„ ์ถœ ์›์น™์„ ์ง€ํ‚ค๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋‹ค๋งŒ ๋ฐฐ์—ด์„ ์Šคํƒ์œผ๋กœ ํ™œ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” push(),pop() ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•˜๋Š”๊ฒƒ์ด ๋” ์ข‹๋‹ค.(์ธ๋ฑ์Šค ๋•Œ๋ฌธ์—)

var stack = [];
stack.push('a');
stack.push('b');
stack.push('c');
console.log(stack.pop()); // c
console.log(stack.pop()); // b
console.log(stack.pop()); // a

15.3 ๋‹จ์ผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋กœ ์Šคํƒ ๊ตฌํ˜„ํ•˜๊ธฐ

  ์Šคํƒ์€ ํ›„์ž…์„ ์ถœ ๊ตฌ์กฐ ์›์น™์„ ์ง€ํ‚ค๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹จ์ผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋กœ๋„ ์Šคํƒ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋งŒ, ๋‹จ์ผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ์Šคํƒ์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐฐ์—ด๊ณผ ๋‹ค๋ฅด๊ฒŒ shift(), unshift()๋กœ ๊ตฌํ˜„ํ•˜๋Š”๊ฒƒ์ด ์ข‹๋‹ค. ๋‹จ์ผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋Š” ์ธ๋ฑ์Šค๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋งˆ์ง€๋ง‰์— ๋…ธ๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ…Œ์ผ ๋…ธ๋“œ์˜ ์ง์ „ ๋…ธ๋“œ๋ฅผ ์ฐพ๊ธฐ์œ„ํ•ด ํ—ค๋“œ ๋…ธ๋“œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ์ฐพ์•„๊ฐ€์•ผ ํ•˜๋ฏ€๋กœ O(N) ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ–๊ฒŒ ๋˜๋ฏ€๋กœ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ๋งจ ์•ž์— ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์ œ๊ฑฐํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์Šคํƒ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๋” ํšจ์œจ์ ์ด๋‹ค.

class Stack {
    constructor(){
        this.first = null;
        this.last = null;
        this.size = 0;
    }
    unshift(val){ // ๋งจ ์•ž์— ๋…ธ๋“œ ์ถ”๊ฐ€
        var newNode = new Node(val);
        if(!this.first){
            this.first = newNode;
            this.last = newNode;
        } else {
            var temp = this.first;
            this.first = newNode;
            this.first.next = temp;
        }
        return ++this.size;
    }
    shift(){ // ๋งจ ์•ž์— ๋…ธ๋“œ ์ถ”๊ฐ€
        if(!this.first) return null; //๋…ธ๋“œ๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธ
        var temp = this.first;
        if(this.first === this.last){ //๋…ธ๋“œ๊ฐ€ ํ•˜๋‚˜์ธ์ง€ ํ™•์ธ
            this.last = null;
        }
        this.first = this.first.next; //๊ฐ’์ด ํ•˜๋‚˜๋ผ๋ฉด ์• ์ดˆ์— next๋Š” null์ด๋ฏ€๋กœ
        // ์œ„์—์„œ๋Š” ๋…ธ๋“œ๊ฐ€ ํ•˜๋‚˜์ธ์ง€ ํ™•์ธํ•˜๋Š” ๊ณผ์ •์—์„œ๋Š” last๋งŒ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋จ
        this.size--;
        return temp.value;
    }
}

15.4 ํ(Queue)

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

 

โ€ป๋ฐฐ์—ด์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ์Šคํƒ&ํ ๊ตฌํ˜„ ์ •๋ฆฌ

์Šคํƒ(ํ›„์ž…์„ ์ถœ) ํ(์„ ์ž…์„ ์ถœ)
push() & pop()  push() & shift()
shift() & unshift() unshift() & pop()

15.5 ๋‹จ์ผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋กœ ํ ์ž‘์„ฑํ•˜๊ธฐ

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

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

class Queue {
    constructor(){
        this.first = null;
        this.last = null;
        this.size = 0;
    }
    enqueue(val){ //push ์—ญํ• ์„ ํ•จ
        var newNode = new Node(val);
        if(!this.first){
            this.first = newNode;
            this.last = newNode;
        } else {
            this.last.next = newNode;
            this.last = newNode;
        }
        return ++this.size;
    }

    dequeue(){ //shift ์—ญํ• ์„ ํ•จ
        if(!this.first) return null; // ๋…ธ๋“œ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ํ™•์ธ

        var temp = this.first;
        if(this.first === this.last) { // ๋…ธ๋“œ๊ฐ€ ํ•œ๊ฐœ์ธ ๊ฒฝ์šฐ ํ™•์ธ
            this.last = null;
        }
        this.first = this.first.next;
        this.size--;
        return temp.value;
    }
}