[BOJ] 9657_돌게임_Python

KSH7841·2021년 9월 15일

PYTHON/백준

목록 보기
6/7

배너를 클릭하면 문제로 넘어갑니다


문제

돌 게임은 두 명이서 즐기는 재밌는 게임이다.

탁자 위에 돌 N개가 있다. 상근이와 창영이는 턴을 번갈아가면서 돌을 가져가며, 돌은 1개, 3개 또는 4개 가져갈 수 있다. 마지막 돌을 가져가는 사람이 게임을 이기게 된다.

두 사람이 완벽하게 게임을 했을 때, 이기는 사람을 구하는 프로그램을 작성하시오. 게임은 상근이가 먼저 시작한다.

입력

첫째 줄에 N이 주어진다. (1 ≤ N ≤ 1000)

출력

상근이가 게임을 이기면 SK를, 창영이가 게임을 이기면 CY을 출력한다.


아이디어

만약 내가 n-1번까지의 승리하거나 패배하는 경우의 정보를 알고 있을 때, n번째에서 내가 필승/필패할 수 있을까?라는 물음에서 출발하였다.

만약 남은 돌이 1,3,4이고 내 차례라면 무조건 이긴다. 남은 돌이 2개라면 무조건 진다. 그 말은 내가 선 플레이어일 때 1개, 3개, 4개인 경우는 무조건 Win이고, 2개일때는 무조건Lose라는 것이다.

그럼 돌이 5개일 때는 어떨까? 직관적으로는 5개에서 3개를 가져가면 2개를 상대에게 남겨서 패배시킬 수 있다. 즉, N개의 돌이 남았을때, N-1, N-3, N-4 중에 Lose값이 있으면 승리할 수 있고, 나머지는 패배한다. 이를 코드로 구현하면 다음과 같다.

import sys
sys.stdin = open('input.txt')

N = int(input())
dp = [0, 'Win', 'Lose', 'Win', 'Win'] + [0]*(N-4) #['Win', 'Win', 'Lose'... ] 
# dp의 의미: 내가 시작할 때 그 자리에 있으면 패배 -> 5번째부터는 1, 3, 4개의 돌을 집어서 Lose로 보낼 수 있으면 Win, 그럴 수 없으면 Lose

if N <= 4:
    pass
else:
    for i in range(5, N+1):
        if 'Lose' in [dp[i-1], dp[i-3], dp[i-4]]:
            dp[i] = 'Win'
        else:
            dp[i] = 'Lose'
if dp[N] == 'Win':
    print('SK')
else:
    print('CY')

처음에는 'SK', 'CY'를 dp list안에 넣어서 처리하려고 하였으나, 그것보다는 선플레이어가 이기는지, 혹은 패배하는지에 따라서 자동적으로 SK 혹은 CY값이 결정되기 때문에 위와 같이 코드를 짤 수 있었다.

0개의 댓글