백준 2164 - 카드 2 (Python3)
코드
시간 초과 (Coner Case 처리 안 함)
n = int(input())
cards = list(range(1, n+1))
cnt = 0
for i in range(n):
#print('cards : ', cards)
f = cards.pop(0)
#print(f)
p = cards.pop(0)
#print(p)
cards.append(p)
cnt += 1
#print(i, ' : ', cards)
if cnt == n or len(cards) == 1:
break
print(cards[0])
deque 사용
import sys
from collections import deque
n = int(sys.stdin.readline())
cards_qu = deque()
for i in range(n):
cards_qu.append(i + 1)
while len(cards_qu) > 1:
cards_qu.popleft()
cards_qu.append(cards_qu.popleft())
print(cards_qu.pop())
규칙 이용
n = int(sys.stdin.readline())
c = 2
while True:
if n == 1 or n == 2:
print(n)
break
# c가 2의 제곱수
c *= 2
# c가 n보다 큰 경우에만 동작
if c >= n:
# n보다 작은 2의 제곱수 중 가장 큰 수
print((n - (c // 2)) * 2)
break
문제 해설
단순히 List를 이용해보니 시간 초과가 나왔다. 이 문제의 경우 sys.stdin.readline()를 사용하고 Pypy3으로 제출하여도 시간 초과가 나오는 것을 보고 List를 사용하면 안 된다는 것을 깨닫고 고민하다가 deque를 사용해야겠다고 느끼고 문제를 푸니 정답으로 인정됐다.
또한 문제를 푸는 도중 규칙이 있는 것 같은데 그 규칙을 점화식으로 작성하는 것이 잘 되지 않아 구글링을 통해 찾아서 규칙을 이용하여 문제를 풀어보았다.
규칙을 파악하기 위해 앞으로 다양한 입력값으로 결과를 도출해보고 위의 블로그 작성자분처럼 정리해서 파악하는 연습을 해야겠다.
댓글남기기