9657. 돌 게임 3
문제
돌 게임은 두 명이서 즐기는 재밌는 게임이다.
탁자 위에 돌 N개가 있다. 상근이와 창영이는 턴을 번갈아가면서 돌을 가져가며, 돌은 1개, 3개 또는 4개 가져갈 수 있다. 마지막 돌을 가져가는 사람이 게임을 이기게 된다.
두 사람이 완벽하게 게임을 했을 때, 이기는 사람을 구하는 프로그램을 작성하시오. 게임은 상근이가 먼저 시작한다.
입력
첫째 줄에 N이 주어진다. (1 ≤ N ≤ 1000)
출력
상근이가 게임을 이기면 SK를, 창영이가 게임을 이기면 CY을 출력한다.
예제 입력
6
예제 출력
SK
1-1) 풀이 1
돌 게임 1(http://js1jj2sk3.tistory.com/30)과 비슷한 문제다. 4개도 가져갈 수 있다는 조건만 추가해주면 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | #include <stdio.h> #include <string.h> using namespace std; #define my 1 #define your 0 #define win true #define lose false int n; int dp[2][1001]; int func(int turn, int remain) { if (remain == 0) { if (turn == my) return dp[turn][remain] = lose; if (turn == your) return dp[turn][remain] = win; } if (remain < 0) { if (turn == my) return 1; if (turn == your) return 0; } if (dp[turn][remain] != -1) return dp[turn][remain]; if (turn == my) dp[my][remain] = func(turn ^ 1, remain - 1) | func(turn ^ 1, remain - 3) | func(turn ^ 1, remain - 4); if (turn == your) dp[your][remain] = func(turn ^ 1, remain - 1) & func(turn ^ 1, remain - 3) & func(turn ^ 1, remain - 4); return dp[turn][remain]; } int main() { scanf("%d", &n); memset(dp, -1, sizeof(dp)); if (func(1, n) == win) puts("SK"); else puts("CY"); return 0; } | cs |
1-2) 풀이 2
0개라면 이미졌다.
1개면 이긴다.
2개면 진다.
3개면 이긴다.
4개면 이긴다.
까지가 기본적인 전략이고, http://js1jj2sk3.tistory.com/30 에서 설명한 추가 전략대로면,
5개면 완벽한 선택으로 상대에게 1, 3, 4 상태를 만들어 주지 않기 위해 3개를 가져가야 한다.
6개면 동일하게 4개를 가져가야 한다.
7개면 1개를 가져가든(나머지 6) 3개를 가져가든(나머지 4) 4개를 가져가든(나머지 3) 상대의 필승이다.
7개일 때부터는 이미 가져갈 수 있는 세 가지 전략에 대해 결과를 이미 알고 있다.
따라서 0개 ~ 6개의 결과가 반복될 것을 알 수 있다. (패/승/패/승/승/승/승)
'알고리즘 > Dynamic Programming 동적계획법' 카테고리의 다른 글
백준) 3032 승리(IVANA) (0) | 2017.08.23 |
---|---|
백준) 11062 카드게임(Card Game) (1) | 2017.08.23 |
백준) 9656 돌 게임 2 (0) | 2017.08.17 |
백준) 9655 돌 게임 (0) | 2017.08.17 |
백준) 11066 파일 합치기 (7) | 2017.07.09 |