치춘짱베리굿나이스
[백준] 9657 본문
돌 게임 3
문제
돌 게임은 두 명이서 즐기는 재밌는 게임이다.
탁자 위에 돌 N개가 있다. 상근이와 창영이는 턴을 번갈아가면서 돌을 가져가며, 돌은 1개, 3개 또는 4개 가져갈 수 있다. 마지막 돌을 가져가는 사람이 게임을 이기게 된다.
두 사람이 완벽하게 게임을 했을 때, 이기는 사람을 구하는 프로그램을 작성하시오. 게임은 상근이가 먼저 시작한다.
입력
첫째 줄에 N이 주어진다. (1 ≤ N ≤ 1000)
출력
상근이가 게임을 이기면 SK를, 창영이가 게임을 이기면 CY을 출력한다.
풀이
#include <iostream>
int main(void) {
int n;
int dp[1001];
std::cin >> n;
dp[1] = 1;
dp[2] = 0;
dp[3] = 1;
dp[4] = 1;
for (int i = 5; i <= n; i++) {
if (dp[i - 1] == 1 && dp[i - 3] == 1 && dp[i - 4] == 1)
dp[i] = 0;
else dp[i] = 1;
}
std::cout << (dp[n] == 1 ? "SK" : "CY") << "\n";
}
반성회
결국 DP 로 풀어버린 돌게임
- 돌의 개수가 1, 3, 4개일 때엔 상근이가 이기고, 2일 때엔 창영이가 이긴다
- 상근이가 이길 수 있는 그 다음 턴에 1, 3, 4개를 냈을 때 돌을 다 가져가게 되면 창영이가 이긴다
- 예를 들어, 돌이 6개일 때 상근이가 이길 수 있다면, 돌이 7, 9, 10개일 때는 창영이가 이긴다는 뜻
- 반대로 생각하면, 돌이
n-1
개,n-3
개,n-4
개일 때 전부 상근이가 이긴다면, 돌이n
개일 때는 창영이가 무조건 이긴다 - 돌이
n-1
,n-3
,n-4
개일 때 중 하나라도 창영이가 이길 수 있는 여지가 있다면, 그 다음 턴인n
개 때에는 상근이가 이길 수 있다 - 예를 들어, 돌이 2개 or 4개 or 5개일 때 모두 상근이가 이긴다면, 돌이 6개일 때는 무슨 짓을 해도 창영이가 이길 수밖에 없다는 뜻 (창영이는 게임에서 최선을 다하므로)
- 돌이 2개 or 4개 or 5개일 때 중 하나라도 창영이가 이긴다면, 그 다음 턴에 상근이가 돌을 가져갈 수 있으므로 돌이 6개일 때 상근이가 이긴다
DP는 너무 어렵다… 사실 완벽하게 이해는 못한 것 같음
Comments