본문 바로가기
백준

[9661] 돌 게임 7 - python 풀이

by mlice1030 2022. 3. 17.

알고리즘 설계 기법

  • Dynamic Programming
  • 중복 호출을 해결하기 위해 수학적 접근 방법 사용
처음에 주어지는 돌 개수 필승 방법 이기는 사람
1 1 SK
2 1-1 CY
3 1-1-1 SK
4 4 SK
5 1-4 / 4-1 CY
6 4-1-1 / 1-4-1 / 1-1-4 SK
7 4-1-1-1 / 1-4-1-1 / 1-1-4-1 / 1-1-1-4 CY
8 7일때 후공이 반드시 이겼으므로,
SK가 처음에 1개를 가져가서 필승
SK
9 5일때 후공이 반드시 이겼으므로,
SK가 처음에 4개를 가져가서 필승
SK
10 9를 만들면 CY에게 주도권이 넘어가고, 6을 만들면 선공이 반드시 이겼으므로
CY필승 -> 즉 내가 10을 마주하는 순간 필패
CY
11 10이면 후공필승, 7이면 선공필승이므로
SK가 처음에 1개를 가져가서 자신을 후공 포지션으로 만듦 -> 필승
SK
12 11이든 8이든 그 상황을 마주한 플레이어가 게임을 주도할 수 있음 -> 즉 여기서 뭘 선택하든 진다 -> 내가 12를 만들면 상대는 무조건 진다 CY
13 12를 만들어서 필승 SK
14 내가 10을 만들어주면 상대는 필패 SK
15 14를 만드나 11을 만드나 상대방이 주도권을 쥐게 됨 -> 따라서 선공이었던 SK는 필패 CY
16 16 SK

사실 돌 개수 6개부터 필패와 필승은 계산해보지 않아도 알 수 있었다.

선공이 1개를 가져가서 5가 될 경우 -> 상대가 무엇을 선택하건 그 상황에서는 후공이 이김

선공이 4개를 가져가서 2가 될 경우 -> 상대가 무엇을 선택하건 그 상황에서는 후공이 이김

 

즉, 상황을 따지며 풀다보면 이기는 사람이 반복되는 것을 볼 수 있다.

따라서 돌 개수를 5로 나눠서 나머지가 2 또는 0이면 무조건 CY가 이기고, 아니면 무조건 SK가 이긴다.

 

N = int(input())
if N % 5 == 2 or N % 5 == 0 : print('CY')
else: print('SK')

문제 풀러가기

 

9661번: 돌 게임 7

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

www.acmicpc.net

 

'백준' 카테고리의 다른 글

[미해결][12976] 돌 옮기기 - python 코드  (0) 2022.03.23
[3029] 경고 - python 풀이  (0) 2022.03.22
[3028] 창영마을 - python 풀이  (0) 2022.03.22
[12887] 경로 게임 - python 풀이  (0) 2022.03.19
[14501] 퇴사 - python 풀이  (0) 2022.03.18

댓글