[백준] 20923번 - 숫자 할리갈리 게임

yerimstar·2021년 7월 9일
0

구현

목록 보기
7/9

아이디어

중요한 조건- 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")
profile
백엔드 개발자

0개의 댓글

관련 채용 정보