백준 - 돌 게임 [9655]

노력하는 배짱이·2021년 4월 6일
0

백준 알고리즘

목록 보기
33/35
post-thumbnail

문제

돌 게임은 두 명이서 즐기는 재밌는 게임이다.

탁자 위에 돌 N개가 있다. 상근이와 창영이는 턴을 번갈아가면서 돌을 가져가며, 돌은 1개 또는 3개 가져갈 수 있다. 마지막 돌을 가져가는 사람이 게임을 이기게 된다.

두 사람이 완벽하게 게임을 했을 때, 이기는 사람을 구하는 프로그램을 작성하시오. 게임은 상근이가 먼저 시작한다.

입력

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

출력

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

풀이

해당 문제는 아래와 같이 간단하게 풀수 있지만 DP로 풀어보겠다.

		if (n % 2 == 0) {
			System.out.println("CY");
		} else {
			System.out.println("SK");
		}

먼저 boolean타입으로 상근이가 낼수 있는 곳이 True, 낼 수 없는 곳이 false라고 하자.
그러면 boolean 타입의 dp 배열의 길이를 n+1만큼 만들어서 값을 넣어주면 된다.

문제에서는 돌을 1개 혹은 3개를 가져갈 수 있다고 한다.
N = 1 이면 상근이가 가져가니 dp[1] = true
N = 2 이면 상근이 1개 창영이 1개 따라서 dp[2] = false
N = 3 이면 상근이가 3개를 가져갈 수 있으니 dp[3] = true
N = 4 이면 상근이가 1개 혹은 3개를 가져가도 마지막엔 창영이가 1개를 가져가니 dp[4] = false

따라서 기본적으로 dp배열을 false로 다 채워 넣은 다음 for문을 돌려 d[i-1]이 false 이면 true로 바꾸고, d[i-3] 이 false이면 true로 바꿔주면 된다.

소스

import java.util.*;

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		int n = sc.nextInt();

//		if (n % 2 == 0) {
//			System.out.println("CY");
//		} else {
//			System.out.println("SK");
//		}

		boolean[] dp = new boolean[n + 1];
		Arrays.fill(dp, false);

		for (int i = 1; i <= n; i++) {
			if (!dp[i - 1]) {
				dp[i] = true;
			}

			if (i - 3 >= 0 && !dp[i - 3]) {
				dp[i] = true;
			}

		}

		if (dp[n]) {
			System.out.println("SK");
		} else {
			System.out.println("CY");
		}

	}

}

0개의 댓글