Coding Test/Codility

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

chamroro 2025. 3. 1. 23:30

์Šคํƒ(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) ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๋ฉฐ, ์ตœ์†Œํ•œ ํ•„์š”ํ•œ ๋Œ€๊ธฐ ์ธ์›์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฐ˜์‘ํ˜•