백준풀기

[c++] 백준 9655번 돌게임 (동적프로그래밍)

해언뵤 2024. 1. 30. 12:30

문제

돌 게임은 두 명이서 즐기는 재밌는 게임이다.
탁자 위에 돌 N개가 있다. 상근이와 창영이는 턴을 번갈아가면서 돌을 가져가며, 돌은 1개 또는 3개 가져갈 수 있다. 마지막 돌을 가져가는 사람이 게임을 이기게 된다.
두 사람이 완벽하게 게임을 했을 때, 이기는 사람을 구하는 프로그램을 작성하시오. 게임은 상근이가 먼저 시작한다.

 

입력

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

 

출력

상근이가 게임을 이기면 SK를, 창영이가 게임을 이기면 CY을 출력한다.

 

 

문제풀이

n이 짝수이면 창영이가 이기고 홀수이면 상근이가 이긴다.
#include <iostream>
#include <algorithm>
using namespace std;

int main() { //직관에 의한 풀이
    int n;
    cin >> n;

    if(n%2 == 0) cout << "CY" <<endl;
    else cout << "SK" <<endl;
}
하지만 이 문제는 동적 프로그래밍으로도 풀어봐야 하는 문제이다.
돌의 개수에 대해 게임 횟수를 저장하는 배열을 하나 선언한다. 1개 또는 3개의 돌을 가져갈 수 있기 때문에 돌의 개수에 대해 게임횟수를 구하는 방법은 p[n] = min(p[n-1]+1, p[n-3]+1)의 식으로 구해야한다. p[n]을 구했다면 2로 나눠지면 창영이가 이기고 아니라면 상근이가 이긴다.
#include <iostream>
#include <algorithm>
using namespace std;

int main(){
    int n;
    cin >> n;
    int pickuprock[1000]; //게임 횟수

    pickuprock[0] = 0;
    pickuprock[1] = 1;
    pickuprock[2] = 2; //1 1 로 집음, i-3계산시 존재하지않는 값 접근방지

    for (int i = 3; i <= n; i++){
        pickuprock[i] = min(pickuprock[i-1]+1, pickuprock[i-3]+1);
    }
    if(pickuprock[n]%2 == 0) cout << "CY" <<endl;
    else cout << "SK" <<endl;
}