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
์์ ์์ ๋ ๋ฐฑ์ค ์๊ณ ๋ฆฌ์ฆ์์ 'ํ'์ ๋ถ๋ฅ๋์ด์๋ ๋ฌธ์ ์ด๋ค.
๊ฐ์ฅ ์์์์นํ ์นด๋๋ ๋ฒ๋ฆฌ๊ณ , ๊ทธ๋ค์ ์นด๋๋ ๊ฐ์ฅ ๋ง์ง๋ง์ผ๋ก ์ฎ๊ธฐ๋ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ ์๊ณ ๋ฆฌ์ฆ.
์๋ค์์ ์์ ๋กญ๊ฒ ์นด๋๋ฅผ ๋ฝ๊ณ , ๋ค์ ๋ฃ๋ ๊ณผ์ ์ ๊ตฌํํด์ผํด์ 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์ ๋์ผํ๋ค.
'๐ป ๊ฐ๋ฐ > Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๋ก๊ทธ๋๋จธ์ค] ํํ Python (์นด์นด์ค ๊ธฐ์ถ) (0) | 2021.09.07 |
---|---|
[ํ๋ก๊ทธ๋๋จธ์ค] ์คํ์ฑํ ๋ฐฉ (Python) (0) | 2021.08.13 |
[ํ๋ก๊ทธ๋๋จธ์ค] ๋๋จธ์ง ํ ์ (Python) (0) | 2021.06.24 |
๋ฐฑ์ค 9095: 1,2,3 ๋ํ๊ธฐ (DP) (0) | 2021.05.31 |
๋ฐฑ์ค 10826: ํผ๋ณด๋์น ์ 4 (DP) (0) | 2021.05.31 |