하스스톤
돌 게임은 두 명이서 즐기는 재밌는 게임이다.
탁자 위에 돌 N개가 있다. 상근이와 창영이는 턴을 번갈아가면서 돌을 가져가며, 돌은 1개 또는 3개 가져갈 수 있다. 마지막 돌을 가져가는 사람이 게임을 지게 된다.
두 사람이 완벽하게 게임을 했을 때, 이기는 사람을 구하는 프로그램을 작성하시오. 게임은 상근이가 먼저 시작한다.
첫째 줄에 N이 주어진다. (1 ≤ N ≤ 1000)
상근이가 게임을 이기면 SK를, 창영이가 게임을 이기면 CY을 출력한다.
DP
로 풀었다.머리가 안 돌아가서 죽는 줄 알았다.
1개
혹은 3개
중에서 내가 이길 수 있는 경우를 가져온다.index
를 증가시키면서 탐색했다.1개
혹은 3개
를 가져올 수 있는데 3개를 가져오면 마지막 돌은 가져온 것이라 상근이가 진다. 반면 1개를 가져오면 창영이게게 1개를 줄 수 있기 때문에 상근이가 이긴다.1개
혹은 3개
를 가져올 수 있는데 3개를 가져오면 마지막 돌도 가져온거라 진다. 그리고 1개를 가져오면 2개가 남는다. 아까 2개가 남으면 무조건 2개가 남았을 때 선택권 있는 사람이 이기는 걸 확인했다(여기서 DP가 쓰인다.). 3개일 때는 선택권을 가진 사람(상근)이 무조건 진다.boolean
배열에 위의 정보를 저장한다. 1개 가져오기와 3개 가져오기 중 이길 수 있는 경우가 하나라도 있다면 선택권을 가진 사람이 이긴다. 반면, 둘 다 false
면(=둘 다 선택권을 가진 사람이 지면) 해당 개수의 돌을 가진 사람은 무조건 진다.!A || !B
인데 저걸 묶고 싶어서 (A&&B)
로 묵었다. 멍청스... !(A&&B)
가 맞음#include <iostream>
#include <algorithm>
using namespace std;
int main() {
cin.tie(NULL);
ios_base::sync_with_stdio(false);
bool arr[1001];
arr[1] = false;
arr[2] = true;
arr[3] = false;
int n;
cin >> n;
for (int i = 4; i <= n; i++) {
if (!(arr[i - 1] && arr[i - 3])) arr[i] = true;
else arr[i] = false;
}
if (arr[n]) cout << "SK";
else cout << "CY";
}