[์ž๋ฃŒ๊ตฌ์กฐ] ๋ฐํฌ(Deque)์ดํ•ดํ•˜๊ธฐ

2021. 5. 20. 00:42ใ†๐Ÿ’ป ๊ฐœ๋ฐœ/Algorithm

1. Deque์˜ ๊ฐœ๋…๊ณผ ๊ตฌ์กฐ

Deque(๋ฐํฌ)๋Š” double-ended-queue์˜ ์ค„์ž„๋ง๋กœ, ์–‘๋ฐฉํ–ฅ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” queueํ˜• ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.

์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด, ์–‘๋ฐฉํ–ฅ์—์„œ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์ถ”๊ฐ€, ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋Š” ์–‘๋ฐฉํ–ฅ ํ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. 

 

2. Deque์— ์กด์žฌํ•˜๋Š” ๋ฉ”์„œ๋“œ ์ข…๋ฅ˜ 

Python์—์„œ deque๋Š” collections๋ผ๋Š” ๋ชจ๋“ˆ์•ˆ์— dequeํด๋ž˜์Šค๋กœ ๋‚ด์žฅ๋˜์–ด์žˆ๋‹ค. 

๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ append() ๋ฉ”์„œ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. 

from collections import deque

deq = deque(['a', 'b', 'c'])
deq.append('d')
print(deq)    # deque(['a', 'b', 'c', 'd'])

๊ธฐ๋ณธ append()๋ฅผ ํ•ด์ฃผ๋ฉด ์œ„์˜ ์˜ˆ์ œ์™€ ๊ฐ™์ด ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ์— ์—˜๋ฆฌ๋จผํŠธ๊ฐ€ ์‚ฝ์ž…๋œ๋‹ค. 

์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์™ผ์ชฝ ๋์— ์‚ฝ์ž…ํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ, appendleft()๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. ์ด๋ฐ–์—๋„ ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์กด์žฌํ•œ๋‹ค. 

 

deque.append(x) : x๋ฅผ ๋ฐํฌ์˜ ์˜ค๋ฅธ์ชฝ ๋์— ์‚ฝ์ž…ํ•œ๋‹ค

deque.appendleft(x) : x๋ฅผ ๋ฐํฌ์˜ ์™ผ์ชฝ ๋์— ์‚ฝ์ž…ํ•œ๋‹ค

deque.pop() : ๋ฐํฌ์˜ ์˜ค๋ฅธ์ชฝ ๋ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋™์‹œ์— ๋ฐํฌ์—์„œ๋Š” ์‚ญ์ œํ•œ๋‹ค

deque.popleft() : ๋ฐํฌ์˜ ์™ผ์ชฝ ๋ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋™์‹œ์— ๋ฐํฌ์—์„œ๋Š” ์‚ญ์ œํ•œ๋‹ค

deque.extend(array) : ๋ฐฐ์—ด array๋ฅผ ์ˆœํ™˜ํ•˜๋ฉด์„œ ๋ฐํฌ์˜ ์˜ค๋ฅธ์ชฝ์— ์ถ”๊ฐ€ํ•œ๋‹ค

deque.extendleft(array) : ๋ฐฐ์—ด array๋ฅผ ์ˆœํ™˜ํ•˜๋ฉด์„œ ๋ฐํฌ์˜ ์™ผ์ชฝ์— ์ถ”๊ฐ€ํ•œ๋‹ค

deque.remove(x) : x๋ฅผ ๋ฐํฌ์—์„œ ์ฐพ์•„ ์‚ญ์ œํ•œ๋‹ค

deque.rotate(num) : ๋ฐํฌ๋ฅผ num๋งŒํผ ํšŒ์ „ํ•œ๋‹ค (์–‘์ˆ˜๋ฉด ์˜ค๋ฅธ์ชฝ, ์Œ์ˆ˜๋Š” ์™ผ์ชฝ์œผ๋กœ)

 

3. Deque๋ฅผ ์“ฐ๋Š” ์ด์œ  

deque๋Š” list๋ณด๋‹ค ์†๋„๊ฐ€ ๋น ๋ฅด๊ณ , ์“ฐ๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์•ˆ์ „ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 

pop(0)์™€ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•  ๋•Œ ๋ฆฌ์ŠคํŠธ์˜ ๊ฒฝ์šฐ O(N)์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ deque๋Š” O(1) ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

๋”ฐ๋ผ์„œ, push์™€ pop์ด ๋นˆ๋ฒˆํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๊ฒฝ์šฐ, list๋ณด๋‹ค deque๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์ด ํšจ์œจ์ ์ด๋ฉฐ ์†๋„๊ฐ€ ๋” ๋น ๋ฅด๋‹ค. 

 

4. ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์ดํ•ดํ•˜๊ธฐ 

https://www.acmicpc.net/problem/2164

 

2164๋ฒˆ: ์นด๋“œ2

N์žฅ์˜ ์นด๋“œ๊ฐ€ ์žˆ๋‹ค. ๊ฐ๊ฐ์˜ ์นด๋“œ๋Š” ์ฐจ๋ก€๋กœ 1๋ถ€ํ„ฐ N๊นŒ์ง€์˜ ๋ฒˆํ˜ธ๊ฐ€ ๋ถ™์–ด ์žˆ์œผ๋ฉฐ, 1๋ฒˆ ์นด๋“œ๊ฐ€ ์ œ์ผ ์œ„์—, N๋ฒˆ ์นด๋“œ๊ฐ€ ์ œ์ผ ์•„๋ž˜์ธ ์ƒํƒœ๋กœ ์ˆœ์„œ๋Œ€๋กœ ์นด๋“œ๊ฐ€ ๋†“์—ฌ ์žˆ๋‹ค. ์ด์ œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋™์ž‘์„ ์นด๋“œ๊ฐ€

www.acmicpc.net

์œ„์˜ ์˜ˆ์ œ๋Š” ๋ฐฑ์ค€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ 'ํ'์— ๋ถ„๋ฅ˜๋˜์–ด์žˆ๋Š” ๋ฌธ์ œ์ด๋‹ค. 

๊ฐ€์žฅ ์•ž์—์œ„์น˜ํ•œ ์นด๋“œ๋Š” ๋ฒ„๋ฆฌ๊ณ , ๊ทธ๋‹ค์Œ ์นด๋“œ๋Š” ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์œผ๋กœ ์˜ฎ๊ธฐ๋Š” ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜. 

์•ž๋’ค์—์„œ ์ž์œ ๋กญ๊ฒŒ ์นด๋“œ๋ฅผ ๋ฝ‘๊ณ , ๋‹ค์‹œ ๋„ฃ๋Š” ๊ณผ์ •์„ ๊ตฌํ˜„ํ•ด์•ผํ•ด์„œ deque๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ’€์ดํ•ด๋ณด์•˜๋‹ค. 

 

ํ’€์ด๊ณผ์ •

 

์–‘๋ฐฉํ–ฅ ํ๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ , ๊ฐ€์žฅ ์™ผ์ชฝ์นด๋“œ๋ฅผ ์‚ญ์ œํ• ๋•Œ๋Š” popleft(), ์™ผ์ชฝ์นด๋“œ๋ฅผ ๋ฝ‘์•„ ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ์— ๋„ฃ์„๋•Œ๋Š” popleft()ํ•œ๊ฑธ ๋‹ค์‹œ appendํ•ด์ฃผ๋ฉด ๋œ๋‹ค. ์ด ๋‘๊ฐ€์ง€ ๊ณผ์ •์„ deque๊ธธ์ด๊ฐ€ 1์ด ๋ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜๋Š”๊ฒƒ. 

 

์ „์ฒด ์ฝ”๋“œ
from collections import deque
n = int(input())
deq = deque()    # collections.deque ์‚ฌ์šฉ

for i in range(n):
    deq.append(i+1)    # [] <- ์˜ค๋ฅธ์ชฝ์—์„œ ์ˆœ์„œ๋Œ€๋กœ ์‚ฝ์ž…
# deque([1, 2, ... , n])
while len(deq) > 1:
    deq.popleft()    # ๋ฐํฌ์˜ ์™ผ์ชฝ ๋ ์›์†Œ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋™์‹œ์— ๋ฐํฌ์—์„œ๋Š” ์‚ญ์ œ
    deq.append(deq.popleft())    # ๋ฐํฌ์˜ ์™ผ์ชฝ ๋ ์›์†Œ๋ฅผ ๋ฝ‘์•„์„œ ์˜ค๋ฅธ์ชฝ ๋์— ์‚ฝ์ž…
print(deq.pop())    # ๋ฐํฌ์˜ ๊ธธ์ด๊ฐ€ 1 ์ดํ•˜์ธ๊ฒฝ์šฐ ๋น ์ ธ๋‚˜์™€ pop() ์ˆ˜ํ–‰

deq.append(deq.popleft()) ์ด๋ถ€๋ถ„ ๋Œ€์‹ ์— deq.rotate(-1)์„ ํ•ด๋„ ๊ฐ™์€๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค. 

rotate(num)์€ ํ•ด๋‹น ํ๋ฅผ num๋งŒํผ ํšŒ์ „ํ•˜๋ผ๋Š” ์˜๋ฏธ๋กœ, -1๋งŒํผ ์™ผ์ชฝ์œผ๋กœ ํ•œ์นธ ํ๋ฅผ ํšŒ์ „์‹œํ‚ค๋Š”๊ฒƒ.

๊ฐ€์žฅ ์™ผ์ชฝ์— ์žˆ๋Š” ์—˜๋ฆฌ๋จผํŠธ๊ฐ€ ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ์— ์˜ค๊ฒŒ๋˜๋ฏ€๋กœ, pop + append์™€ ๋™์ผํ•˜๋‹ค.