중요한 조건- 2-4번 과정을 진행하는 것은 도도와 수연이 모두 진행하는 것이 아니라 순서에 맞게 번갈아가면서 진행하는 것이다.
첫 시도에서 문제를 잘못 읽은 부분 - 종을 치고 그라운드에 있는 카드를 덱으로 가져올 때 상대방의 카드를 먼저 자신의 덱으로 합친 뒤, 자신의 카드를 합쳐야 하는데 이를 반대로 읽고 이해했음...
문제의 키포인트
시간초과가 발생하므로, 무작정 for문으로 넣어주고 비교하는 것이 아니라 deque를 적극 활용할 것 !
추가적으로 pypy, sys를 사용하면 시간초과를 피할 수 있음
파이썬 중요 개념
deque 2개를 합치고 싶을 때는 append가 아니라 extend를 사용할 것.
deque에서는 appendleft처럼 dequeleft도 가능함
import sys
from collections import deque
N,M = map(int,sys.stdin.readline().split())
do_queue = deque()
su_queue = deque()
for _ in range(N):
do,su = map(int,sys.stdin.readline().split())
do_queue.append(do)
su_queue.append(su)
do_check = 0
su_check = 0
do_tmp = deque()
su_tmp = deque()
for m in range(M):
if m % 2 == 0:
do_check = do_queue.pop()
do_tmp.append(do_check)
else:
su_check = su_queue.pop()
su_tmp.append(su_check)
if len(do_queue) == 0:
print("su")
exit()
elif len(su_queue) == 0:
print("do")
exit()
if (do_check + su_check == 5) and (do_check != 0) and (su_check != 0):
if do_tmp:
su_queue.extendleft(do_tmp)
do_check = 0
do_tmp = deque()
if su_tmp:
su_queue.extendleft(su_tmp)
su_check = 0
su_tmp = deque()
elif (do_check == 5) or (su_check == 5):
if su_tmp:
do_queue.extendleft(su_tmp)
su_check = 0
su_tmp = deque()
if do_tmp:
do_queue.extendleft(do_tmp)
do_check = 0
do_tmp = deque()
if len(do_queue) > len(su_queue):
print("do")
elif len(do_queue) < len(su_queue):
print("su")
elif len(do_queue) == len(su_queue):
print("dosu")