๐Ÿงฉ Algorithm/[Programmers] ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ณ ๋“์  KIT

[Programmers/์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ณ ๋“์  KIT] ๊ธฐ๋Šฅ๊ฐœ๋ฐœ

devCloud 2026. 4. 1. 15:41
728x90

[Programmers] ๊ธฐ๋Šฅ๊ฐœ๋ฐœ

Level 2 | #์Šคํƒ/ํ #ํ(Queue)

1. ๋ฌธ์ œ ์š”์•ฝ

๊ฐ ๊ธฐ๋Šฅ์˜ ๊ฐœ๋ฐœ ์ง„๋„์™€ ๊ฐœ๋ฐœ ์†๋„๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ, ๋’ค์— ์žˆ๋Š” ๊ธฐ๋Šฅ์€ ์•ž์˜ ๊ธฐ๋Šฅ์ด ๋ฐฐํฌ๋  ๋•Œ ํ•จ๊ป˜ ๋ฐฐํฌ๋˜์–ด์•ผ ํ•œ๋‹ค.

๊ฐ ๋ฐฐํฌ๋งˆ๋‹ค ๋ช‡ ๊ฐœ์˜ ๊ธฐ๋Šฅ์ด ๋ฐฐํฌ๋˜๋Š”์ง€๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ ๋ฆฌ์ŠคํŠธ๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

2. ์ ‘๊ทผ ๋ฐฉ์‹ ๋น„๊ต

๋จผ์ € ๋ชจ๋“  ๊ธฐ๋Šฅ์˜ ๋‚จ์€ ์ž‘์—… ์ผ์ˆ˜(days)๋ฅผ ์˜ฌ๋ฆผ ์—ฐ์‚ฐ์œผ๋กœ ๊ณ„์‚ฐํ•œ ๋’ค, ๋ฐฐํฌ ๊ทธ๋ฃน์„ ๋ฌถ๋Š”๋‹ค.

๐Ÿค” ์™œ ํ(Queue)๊ฐ€ ๋” ์ ํ•ฉํ• ๊นŒ?

๊ธฐ๋Šฅ์€ ํ•ญ์ƒ **๋จผ์ € ๋“ค์–ด์˜จ ์ˆœ์„œ๋Œ€๋กœ** ๋ฐฐํฌ๋˜์–ด์•ผ ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ **FIFO(First-In-First-Out)** ํŠน์„ฑ์ด ์ด ๋ฌธ์ œ์˜ ๋ฐฐํฌ ๊ทœ์น™๊ณผ ์ •ํ™•ํžˆ ์ผ์น˜ํ•˜๋ฏ€๋กœ, ์•ž์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ํ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์ ์œผ๋กœ ๋” ๋ช…ํ™•ํ•˜๋‹ค.

3. ๊ถŒ์žฅ ํ’€์ด: ํ(Queue) ์‚ฌ์šฉ

deque์˜ popleft()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆœ์„œ๋Œ€๋กœ ๋ฐฐํฌ๋Ÿ‰์„ ์นด์šดํŠธํ•œ๋‹ค.

import math
from collections import deque

def solution(progresses, speeds):
    # ๊ฐ ๊ธฐ๋Šฅ์ด ์™„๋ฃŒ๋˜๊ธฐ๊นŒ์ง€ ํ•„์š”ํ•œ ์ผ์ˆ˜ ๊ณ„์‚ฐ
    days = [math.ceil((100 - p) / s) for p, s in zip(progresses, speeds)]
    
    queue = deque(days)
    answer = []
    
    while queue:
        current = queue.popleft() # ํ˜„์žฌ ๋ฐฐํฌ์˜ ๊ธฐ์ค€์ด ๋˜๋Š” ์ผ์ˆ˜
        count = 1
        
        # ๊ธฐ์ค€ ์ผ์ˆ˜๋ณด๋‹ค ์ผ์ฐ ๋๋‚˜๋Š” ๋’ค์˜ ๊ธฐ๋Šฅ๋“ค์„ ํ•จ๊ป˜ ๋ฐฐํฌ
        while queue and queue[0] <= current:
            queue.popleft()
            count += 1
            
        answer.append(count)
        
    return answer

4. ์ฐธ๊ณ  ํ’€์ด: ์Šคํƒ(Stack) ์‚ฌ์šฉ

์Šคํƒ์˜ top(์—ฌ๊ธฐ์„œ๋Š” stack[0]) ์›์†Œ๋ฅผ ์œ ์ง€ํ•˜๋ฉฐ ๋น„๊ตํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

import math

def solution(progresses, speeds):
    days = [math.ceil((100 - progress) / speed) for progress, speed in zip(progresses, speeds)]
    
    stack = []
    answer = []
    for day in days:
        if not stack or stack[0] >= day:
            stack.append(day)
        else:
            answer.append(len(stack))
            stack = [day] # ์ƒˆ ๊ทธ๋ฃน ์‹œ์ž‘
            
    answer.append(len(stack))
    return answer

5. ํ(Queue) ํ’€์ด์˜ ์žฅ์ 

  • ์ง๊ด€์„ฑ: popleft()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐํฌ ์ˆœ์„œ๋ฅผ ๋ช…ํ™•ํžˆ ํ‘œํ˜„ํ•œ๋‹ค.
  • ๋ช…ํ™•์„ฑ: ๋ฐฐํฌ๋  ๊ทธ๋ฃน์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์นด์šดํŠธํ•˜์—ฌ answer์— ์ถ”๊ฐ€ํ•˜๋Š” ๋กœ์ง์ด ๋” ์ฝ๊ธฐ ์‰ฝ๋‹ค.
  • ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ: ๋ถˆํ•„์š”ํ•œ ๋ฆฌ์ŠคํŠธ ์ดˆ๊ธฐํ™” ์—ฐ์‚ฐ์„ ์ค„์ด๊ณ  ํ์˜ ๊ตฌ์กฐ๋ฅผ ๋ฐฑ๋ถ„ ํ™œ์šฉํ•œ๋‹ค.
728x90