๋ฌธ์ ๋ถ์
์ฒซ ๋ฒ์งธ ๋จ๊ณ(๋ฌธ์ ์์ฝ ๋ฐ ์กฐ๊ฑด ํ์
)
์ ์๋ฅผ ์ ์ฅํ๋ ํ ๊ตฌํํ๊ณ , ์
๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ ๋ช
๋ น ์ฒ๋ฆฌ
๋ช
๋ น์ ์ด 6๊ฐ์ง
-
push x: ์ ์ x๋ฅผ ํ์ ๋ฃ์
-
pop: ํ์์ ๊ฐ์ฅ ์์ ์๋ ์ ์ ๊บผ๋ด๊ธฐ, ๊ทธ ์๋ฅผ ์ถ๋ ฅ. ๋ง์ฝ ํ๊ฐ ๋น์๋ค๋ฉด -1 ์ถ๋ ฅ
-
size: ํ์ ๋ค์ด์๋ ์ ์ ๊ฐ์ ์ถ๋ ฅ
-
empty: ํ๊ฐ ๋น์ด์์ผ๋ฉด 1, ์๋๋ฉด 0 ์ถ๋ ฅ
-
front: ํ์์ ๊ฐ์ฅ ์์ ์๋ ์ ์ ์ถ๋ ฅ. ๋ง์ฝ ํ๊ฐ ๋น์๋ค๋ฉด -1 ์ถ๋ ฅ
-
back: ํ์์ ๊ฐ์ฅ ๋ค์ ์๋ ์ ์ ์ถ๋ ฅ. ๋ง์ฝ ํ๊ฐ ๋น์๋ค๋ฉด -1 ์ถ๋ ฅ
-
์
๋ ฅ
์ฒซ์งธ ์ค์ ์ฃผ์ด์ง๋ ๋ช
๋ น์ ์ N (1 โค N โค 10,000)์ด ์ฃผ์ด์ง.
๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์๋ ๋ช
๋ น์ด ํ๋์ฉ ์ฃผ์ด์ง๋ค
์ฃผ์ด์ง๋ ์ ์๋ 1๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , 100,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๋ค. ๋ฌธ์ ์ ๋์์์ง ์์ ๋ช
๋ น์ด ์ฃผ์ด์ง๋ ๊ฒฝ์ฐ๋ ์๋ค.
์ถ๋ ฅํด์ผํ๋ ๋ช
๋ น์ด ์ฃผ์ด์ง ๋๋ง๋ค, ํ ์ค์ ํ๋์ฉ ์ถ๋ ฅํ๋ค.
๋ ๋ฒ์งธ ๋จ๊ณ (๋ฌธ์ ํต์ฌ ํ์
)
6๊ฐ์ง ๊ธฐ๋ฅ์ ๊ฐ์ถ ํ๋ฅผ ๊ตฌํํ๋ค
ํ์ด์ฌ์์ ์ ๊ณตํ๋ ํ ์๋ฃ๊ตฌ์กฐ์ธ deque๋ฅผ ์ด์ฉํ์
-
ํ ๊ตฌํ์ list๋ฅผ ์ด์ฉํ์ง ์๋ ์ด์
์คํ์์ list.append์ list.pop()์ ์ด์ฉํ๋ ๊ฒ์ฒ๋ผ list.append์ list.pop(0)์ ์ด์ฉํ๋ฉด ๋ฆฌ์คํธ๋ฅผ ํ์ฒ๋ผ ์ฌ์ฉํ ์ ์๋ค. ํ์ง๋ง pop()์ time complexity๋ O(1)์ธ ๋ฐ๋ฉด pop(0)์ time complexity๋ O(N)์ด๊ธฐ ๋๋ฌธ์ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฐ๋ค. ๋ฐ๋ผ์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ณ ๋ คํด ๋ฆฌ์คํธ๋ ํ๋ก ์ฌ์ฉํ์ง ์๋๋ค.
์ฝ๋ ์์ฑ
import collections
import sys
input = sys.stdin.readline
q = collections.deque() # ํ ์์ฑ
n = int(input())
for _ in range(n):
command = input().split()
if command[0] == "push": # push ๋ช
๋ น
q.append(command[1])
elif command[0] == "front":
if not q: # ํ๊ฐ ๋น์๋ค๋ฉด
print(-1)
else:
print(q[0])
elif command[0] == "back":
if not q: # ํ๊ฐ ๋น์๋ค๋ฉด
print(-1)
else:
print(q[-1])
elif command[0] == "size":
print(len(q))
elif command[0] == "empty":
if not q: # ํ๊ฐ ๋น์๋ค๋ฉด
print(1)
else:
print(0)
elif command[0] == "pop":
if not q: # ํ๊ฐ ๋น์๋ค๋ฉด
print(-1)
else:
print(q.popleft())
๋๋์
deque vs heapq
deque๋ ์คํ+ํ ์๋ฃ๊ตฌ์กฐ. ๊ฐ์ฅ์๋ฆฌ์ ์์๋ฅผ ๋ฃ๊ฑฐ๋ ๋บ ์ ์๋ค. pop()๊ณผ popleft() ๋ชจ๋ ์๊ฐ๋ณต์ก๋๊ฐ O(1)๋ก ๋งค์ฐ ์ข๋ค.
| ๋ฉ์๋ |
์ค๋ช
|
| deque(iterable, [, maxlen]) |
์ด๊ธฐํ ํจ์์ด๋ค. iterable(๋ฆฌ์คํธ ๋ฑ)์ ์ธ์๋ก ๊ฑด๋ด๋ฉด ์ด๋ฅผ dequeํ ์์ผ์ค๋ค. |
| append(x) |
x๋ฅผ ๋ฑ์ ์ค๋ฅธ์ชฝ์ ์ฝ์
ํ๋ค. |
| popleft() |
๋ฑ์ ๊ฐ์ฅ ์ผ์ชฝ์ ์๋ ์์๋ฅผ ๋ฑ์์ ์ ๊ฑฐํ๊ณ , ๊ทธ ๊ฐ์ ๋ฆฌํดํ๋ค. |
| clear() |
๋ชจ๋ ์์๋ฅผ ์ง์ด๋ค. |
heapq๋ ์ฐ์ ์์ ํ. ์ต์ ํ์ ์ง์ํ๋ฉฐ, ์ต๋จ ๊ฒฝ๋ก๋ฅผ ํ์ํ๋ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ ๋ฑ์ ์ฌ์ฉ๋จ.
- ๊ทผ๋ฐ ํ์ ๋ญ๋ฐ?
-
์ต์๊ฐ, ์ต๋๊ฐ์ ๋น ๋ฅด๊ฒ ์ฐพ๊ธฐ ์ํด ๊ณ ์๋ ์์ ์ด์ง ํธ๋ฆฌ.
-
์ต์๊ฐ์ด๋ ์ต๋๊ฐ์ ์ฐพ๊ธฐ ์ํด ๋ฐฐ์ด์ ์ฌ์ฉํ๋ฉด ฮ(n)๋งํผ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค.
ํ์ง๋ง ํ์ ์ฌ์ฉํ๋ฉด O(logn)๋งํผ ์์๋๋ฏ๋ก, ๋ฐฐ์ด์ ์ฌ์ฉํ ๋๋ณด๋ค ๋น ๋ฅด๊ฒ ์ต์๊ฐ๊ณผ ์ต๋๊ฐ์ ๊ตฌํ ์ ์๋ค.
์ฐ์ ์์ ํ์ ๊ฐ์ด ์ต๋๊ฐ ๋๋ ์ต์๊ฐ์ ๋น ๋ฅด๊ฒ ์ฐพ์์ผํ๋ ์๊ณ ๋ฆฌ์ฆ ๋ฑ์ ํ์ฉ๋๋ค.
์ฐธ๊ณ ๋ธ๋ก๊ทธ
๋ฌธ์ ๋ถ์
์ฒซ ๋ฒ์งธ ๋จ๊ณ(๋ฌธ์ ์์ฝ ๋ฐ ์กฐ๊ฑด ํ์ )
์ ์๋ฅผ ์ ์ฅํ๋ ํ ๊ตฌํํ๊ณ , ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ ๋ช ๋ น ์ฒ๋ฆฌ
๋ช ๋ น์ ์ด 6๊ฐ์ง
push x: ์ ์ x๋ฅผ ํ์ ๋ฃ์
pop: ํ์์ ๊ฐ์ฅ ์์ ์๋ ์ ์ ๊บผ๋ด๊ธฐ, ๊ทธ ์๋ฅผ ์ถ๋ ฅ. ๋ง์ฝ ํ๊ฐ ๋น์๋ค๋ฉด -1 ์ถ๋ ฅ
size: ํ์ ๋ค์ด์๋ ์ ์ ๊ฐ์ ์ถ๋ ฅ
empty: ํ๊ฐ ๋น์ด์์ผ๋ฉด 1, ์๋๋ฉด 0 ์ถ๋ ฅ
front: ํ์์ ๊ฐ์ฅ ์์ ์๋ ์ ์ ์ถ๋ ฅ. ๋ง์ฝ ํ๊ฐ ๋น์๋ค๋ฉด -1 ์ถ๋ ฅ
back: ํ์์ ๊ฐ์ฅ ๋ค์ ์๋ ์ ์ ์ถ๋ ฅ. ๋ง์ฝ ํ๊ฐ ๋น์๋ค๋ฉด -1 ์ถ๋ ฅ
์ ๋ ฅ
์ฒซ์งธ ์ค์ ์ฃผ์ด์ง๋ ๋ช ๋ น์ ์ N (1 โค N โค 10,000)์ด ์ฃผ์ด์ง.
๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์๋
๋ช ๋ น์ด ํ๋์ฉ ์ฃผ์ด์ง๋ค์ฃผ์ด์ง๋ ์ ์๋ 1๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , 100,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๋ค. ๋ฌธ์ ์ ๋์์์ง ์์ ๋ช ๋ น์ด ์ฃผ์ด์ง๋ ๊ฒฝ์ฐ๋ ์๋ค.
์ถ๋ ฅํด์ผํ๋ ๋ช ๋ น์ด ์ฃผ์ด์ง ๋๋ง๋ค, ํ ์ค์ ํ๋์ฉ ์ถ๋ ฅํ๋ค.
๋ ๋ฒ์งธ ๋จ๊ณ (๋ฌธ์ ํต์ฌ ํ์ )
6๊ฐ์ง ๊ธฐ๋ฅ์ ๊ฐ์ถ
ํ๋ฅผ ๊ตฌํํ๋คํ์ด์ฌ์์ ์ ๊ณตํ๋ ํ ์๋ฃ๊ตฌ์กฐ์ธ
deque๋ฅผ ์ด์ฉํ์ํ ๊ตฌํ์ list๋ฅผ ์ด์ฉํ์ง ์๋ ์ด์
์คํ์์ list.append์ list.pop()์ ์ด์ฉํ๋ ๊ฒ์ฒ๋ผ list.append์ list.pop(0)์ ์ด์ฉํ๋ฉด ๋ฆฌ์คํธ๋ฅผ ํ์ฒ๋ผ ์ฌ์ฉํ ์ ์๋ค. ํ์ง๋ง pop()์ time complexity๋ O(1)์ธ ๋ฐ๋ฉด pop(0)์ time complexity๋ O(N)์ด๊ธฐ ๋๋ฌธ์ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฐ๋ค. ๋ฐ๋ผ์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ณ ๋ คํด ๋ฆฌ์คํธ๋ ํ๋ก ์ฌ์ฉํ์ง ์๋๋ค.
์ฝ๋ ์์ฑ
๋๋์
deque vs heapq
deque๋ ์คํ+ํ ์๋ฃ๊ตฌ์กฐ. ๊ฐ์ฅ์๋ฆฌ์ ์์๋ฅผ ๋ฃ๊ฑฐ๋ ๋บ ์ ์๋ค. pop()๊ณผ popleft() ๋ชจ๋ ์๊ฐ๋ณต์ก๋๊ฐ O(1)๋ก ๋งค์ฐ ์ข๋ค.
heapq๋ ์ฐ์ ์์ ํ. ์ต์ ํ์ ์ง์ํ๋ฉฐ, ์ต๋จ ๊ฒฝ๋ก๋ฅผ ํ์ํ๋ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ ๋ฑ์ ์ฌ์ฉ๋จ.
์ต์๊ฐ, ์ต๋๊ฐ์ ๋น ๋ฅด๊ฒ ์ฐพ๊ธฐ ์ํด ๊ณ ์๋ ์์ ์ด์ง ํธ๋ฆฌ.
์ต์๊ฐ์ด๋ ์ต๋๊ฐ์ ์ฐพ๊ธฐ ์ํด ๋ฐฐ์ด์ ์ฌ์ฉํ๋ฉด ฮ(n)๋งํผ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค.
ํ์ง๋ง ํ์ ์ฌ์ฉํ๋ฉด O(logn)๋งํผ ์์๋๋ฏ๋ก, ๋ฐฐ์ด์ ์ฌ์ฉํ ๋๋ณด๋ค ๋น ๋ฅด๊ฒ ์ต์๊ฐ๊ณผ ์ต๋๊ฐ์ ๊ตฌํ ์ ์๋ค.
์ฐ์ ์์ ํ์ ๊ฐ์ด ์ต๋๊ฐ ๋๋ ์ต์๊ฐ์ ๋น ๋ฅด๊ฒ ์ฐพ์์ผํ๋ ์๊ณ ๋ฆฌ์ฆ ๋ฑ์ ํ์ฉ๋๋ค.
์ฐธ๊ณ ๋ธ๋ก๊ทธ
deque
(https://ooeunz.tistory.com/31)
heap
(https://velog.io/@gnwjd309/data-structure-heap)