문제
알고리즘
- deque() 함수를 통해 문제를 수행한다.
- n장의 카드를 1부터 n까지 번호를 매겨준다.
- 리스트의 크기가 1일때까지 반복하여 카드를 하나 버리고 첫 번째 카드를 맨 뒤로 옮겨준다.
코드
import sys
from collections import deque
n = int(sys.stdin.readline())
heap = deque()
# n장의 카드를 1 부터 n 까지 번호르 매겨준다.
for i in range(1, n + 1):
heap.append(i)
# 리스트의 크기가 1일때까지 반복한다.
while len(heap) != 1:
heap.popleft() # 팝한다.
heap.append(heap.popleft()) # 첫 번째 수를 맨 뒤로 옮긴다.
print(heap[0])
실패한 코드(시간초과)
import sys
n = int(sys.stdin.readline())
heap = [i for i in range(1, n + 1)]
while len(heap) != 1:
heap.pop(0)
heap.append(heap.pop(0))
print(heap[0])
pop(i)는 시간 복잡도가 O(N)이기 때문에 위 코드의 시간 복잡도는 O(N^2)이 된다.
따라서 deque 모듈을 통해 시간복잡도가 O(1)인 popleft() 함수를 사용하여 코드의 시간 복잡도를 O(N)으로 만들어 문제를 풀었다.
github
'CodingTest > Baekjoon' 카테고리의 다른 글
[baekjoon] 백준 1927번(파이썬): 최소 힙 (0) | 2021.09.21 |
---|---|
[baekjoon] 백준 10816번(파이썬): 숫자 카드 2 (0) | 2021.09.20 |
[baekjoon] 백준 11866번(파이썬): 요세푸스 문제 0 (0) | 2021.09.18 |
[baekjoon] 백준 1966번(파이썬): 프린터 큐 (0) | 2021.09.17 |
[baekjoon] 백준 10773번(파이썬): 제로 (0) | 2021.09.16 |