백준문제풀이
백준 문제 9657번 돌 게임 3 문제풀이 c++
노가다 김씨
2022. 2. 20. 03:17
https://www.acmicpc.net/problem/9657
9657번: 돌 게임 3
상근이가 게임을 이기면 SK를, 창영이가 게임을 이기면 CY을 출력한다.
www.acmicpc.net
문제해석
이 문제는 dp로 해결 가능하다.
dp[n]이 0일때 상근 승리 , 1일때 창영 승리라고 정의하면 첫턴은 무조건 상근이이므로
dp[n-1],dp[n-3],dp[n-4]를 보아서 그 셋이 전부 0이라면(dp[n-1],dp[n-3],dp[n-4]셋이 전부 상근 승리)
dp[n]은 상근이가 1개를 가져가든 3개를 가져가든 4개를 가져가든 다음턴에는 무조건 창영이가 승리한다.
그 반대로 그 셋이 전부 1이라면 상근이가 1개를 가져가든 3개를 가져가든 4개를 가져가든 다음턴에는 무조건 상근이가 승리한다.
그러나 셋중 하나라도 창영이 승리하는 경우가 있다면 주도권이 상근이에게 있으므로 무조건 상근이가 승리한다.
이게 설명으로 이해가 가지 않는다면 N=1부터 차근차근 써보면서 보면 쉽게 찾을 수 있다.
이 생각을 바탕으로 아래와 같이 코드를 작성했다.
코드
#include <iostream>
#include <algorithm>
using namespace std;
bool a[1001];
int main(){
cout.tie(NULL);
cin.tie(NULL);
ios_base::sync_with_stdio(false);
a[1]=0;
a[2]=1;
a[3]=0;
a[4]=0;
a[5]=0;
for(int i=6; i<1001; i++)
{
if(a[i-1]==a[i-3]&&a[i-1]==a[i-4])
{
if(a[i-1]==0)
{
a[i]=1;
}
else
{
a[i]=0;
}
}
else
{
a[i]=0;
}
}
int n;
cin>>n;
if(a[n]==0)
{
cout<<"SK";
}
else
{
cout<<"CY";
}
}