7. ์Šคํƒ๊ณผ ํ (Stacks and Queues) Codility Lesson ํ•œ๊ตญ์–ด ์ •๋ฆฌ๋ณธ (JavaScript ver.)

    ์Šคํƒ(Stack)๊ณผ ํ(Queue)๋ž€?

    ์Šคํƒ๊ณผ ํ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋Œ€ํ‘œ์ ์ธ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค. ์ด๋“ค์€ push(์‚ฝ์ž…) ๋ฐ pop(์‚ญ์ œ) ์—ฐ์‚ฐ์„ ์ œ๊ณตํ•˜์ง€๋งŒ, ๋ฐ์ดํ„ฐ์˜ ์ž…์ถœ๋ ฅ ๋ฐฉ์‹์ด ๋‹ค๋ฅด๋‹ค.


    1. ์Šคํƒ(Stack)

    ์Šคํƒ์€ LIFO(Last In, First Out) ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๋ฉฐ, ๊ฐ€์žฅ ์ตœ๊ทผ์— ์ถ”๊ฐ€๋œ ์š”์†Œ๊ฐ€ ๊ฐ€์žฅ ๋จผ์ € ์ œ๊ฑฐ๋œ๋‹ค. ๋งˆ์น˜ ์ ‘์‹œ๋ฅผ ์Œ“์•„์˜ฌ๋ฆฌ๊ณ  ์œ„์—์„œ๋ถ€ํ„ฐ ํ•˜๋‚˜์”ฉ ์ œ๊ฑฐํ•˜๋Š” ๋ฐฉ์‹๊ณผ ์œ ์‚ฌํ•˜๋‹ค.

    JavaScript ์ฝ”๋“œ:

    class Stack {
        constructor() {
            this.stack = [];
        }
        
        push(x) {
            this.stack.push(x);
        }
        
        pop() {
            if (this.isEmpty()) throw new Error("Stack is empty");
            return this.stack.pop();
        }
        
        isEmpty() {
            return this.stack.length === 0;
        }
    }
    

    ์‹œ๊ฐ„ ๋ณต์žก๋„: O(1) (push, pop ์—ฐ์‚ฐ ๋ชจ๋‘ ์ƒ์ˆ˜ ์‹œ๊ฐ„์— ์ˆ˜ํ–‰๋จ)


    2. ํ(Queue)

    ํ๋Š” FIFO(First In, First Out) ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๋ฉฐ, ๋จผ์ € ์ถ”๊ฐ€๋œ ์š”์†Œ๊ฐ€ ๊ฐ€์žฅ ๋จผ์ € ์ œ๊ฑฐ๋œ๋‹ค. ์ด๋Š” ๋งˆ์น˜ ์€ํ–‰ ์ฐฝ๊ตฌ์—์„œ ์ค„์„ ์„œ๋Š” ๋ฐฉ์‹๊ณผ ๊ฐ™๋‹ค.

    JavaScript ์ฝ”๋“œ:

    class Queue {
        constructor() {
            this.queue = [];
        }
        
        push(x) {
            this.queue.push(x);
        }
        
        pop() {
            if (this.isEmpty()) throw new Error("Queue is empty");
            return this.queue.shift();
        }
        
        isEmpty() {
            return this.queue.length === 0;
        }
        
        size() {
            return this.queue.length;
        }
    }
    

    ์‹œ๊ฐ„ ๋ณต์žก๋„: O(1) (push ์—ฐ์‚ฐ), O(n) (shift ์—ฐ์‚ฐ → ๊ฐœ์„  ๊ฐ€๋Šฅ)

    ํšจ์œจ์ ์ธ ํ ๊ตฌํ˜„์„ ์œ„ํ•ด ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ๋˜๋Š” ์ˆœํ™˜ ๋ฒ„ํผ(Circular Buffer) ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.


    3. ์Šˆํผ๋งˆ์ผ“ ๋Œ€๊ธฐ์—ด ๋ฌธ์ œ

    ์Šˆํผ๋งˆ์ผ“์—์„œ ์‚ฌ๋žŒ๋“ค์ด ์ค„์„ ์„œ๊ณ , ์ผ์ • ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด ํ•œ ๋ช…์”ฉ ๊ณ„์‚ฐ์„ ๋งˆ์น˜๊ณ  ๋‚˜๊ฐ€๋Š” ์ƒํ™ฉ์„ ๋ชจ๋ธ๋งํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

    ๋ฐฐ์—ด A๋Š” 0๊ณผ 1๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์œผ๋ฉฐ:

    • 0 → ์ƒˆ๋กœ์šด ์‚ฌ๋žŒ์ด ์ค„์„ ์„ฌ (push ์—ฐ์‚ฐ)
    • 1 → ์ค„ ์•ž์˜ ์‚ฌ๋žŒ์ด ๊ณ„์‚ฐ์„ ๋งˆ์นจ (pop ์—ฐ์‚ฐ)

    ์ด๋•Œ, ์‹œ๋ฎฌ๋ ˆ์ด์…˜์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ์ตœ์†Œ ๋ช‡ ๋ช…์ด ์ค„์„ ์„œ ์žˆ์–ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

    O(n) ํ•ด๊ฒฐ๋ฒ• (ํ ํฌ๊ธฐ ์ถ”์ )

    function groceryStore(A) {
        let size = 0;
        let result = 0;
        
        for (let i = 0; i < A.length; i++) {
            if (A[i] === 0) {
                size++;
            } else {
                size--;
            }
            result = Math.max(result, -size);
        }
        return result;
    }
    

    ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ O(n) ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๋ฉฐ, ์ตœ์†Œํ•œ ํ•„์š”ํ•œ ๋Œ€๊ธฐ ์ธ์›์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

    ๋ฐ˜์‘ํ˜•

    ๋Œ“๊ธ€