9655번: 돌 게임
상근이가 게임을 이기면 SK를, 창영이가 게임을 이기면 CY을 출력한다.
www.acmicpc.net
문제
돌 게임은 두 명이서 즐기는 재밌는 게임이다.
탁자 위에 돌 N개가 있다. 상근이와 창영이는 턴을 번갈아가면서 돌을 가져가며, 돌은 1개 또는 3개 가져갈 수 있다. 마지막 돌을 가져가는 사람이 게임을 이기게 된다.
두 사람이 완벽하게 게임을 했을 때, 이기는 사람을 구하는 프로그램을 작성하시오. 게임은 상근이가 먼저 시작한다.
입력
첫째 줄에 N이 주어진다. (1 ≤ N ≤ 1000)
출력
상근이가 게임을 이기면 SK를, 창영이가 게임을 이기면 CY을 출력한다.
코드
n = int(input())
if n % 2 == 0:
print("CY")
else:
print("SK")
가져갈 수 있는 돌이 모두 홀수 개이므로 사실 복잡한 알고리즘도 필요없고 애초에 주어진 돌이 홀수 개냐 짝수 개냐 그것만 판단하면 문제를 아주 쉽게 풀 수 있다. 홀수 개의 돌이면 무조건 먼저 시작한 상근이가 이기고, 짝수 개의 돌이면 창영이가 이긴다.
하지만 이 문제는 다이나믹 프로그래밍을 연습하기 위한 문제였으므로 다이나믹 프로그래밍을 이용하여 풀어보겠다.
n = int(input())
dp = [0, 1, 2, 1] # n개의 돌이 있을 때 두 사람이 최소로 게임을 진행하는 횟수
if n >= 3:
for i in range(3, n + 1):
dp.append(min(dp[i-1], dp[i-3]))
if dp[n] % 2 == 1:
print("SK")
else:
print("CY")
dp 배열에는 n번째 원소에 n개의 돌이 있을 때 두 사람이 최소로 게임을 진행하는 횟수를 넣어줄 것이다. 그러기 위해서 최값으로는 [0, 1, 2, 1]을 넣어주었다. 이제 이 배열에 대해 반복문을 돌며 돌의 개수에 따른 두 사람의 최소 게임 횟수를 넣어줄 것이다.
최종적으로 우리가 입력받은 n개의 돌이 있을 때 두 사람이 최소 게임 횟수가 dp[n]의 값일 것이다. 이 값이 홀수라면 먼저 시작한 상근이, 짝수라면 창영이가 이긴 것이다.
'문제풀이 > 수학' 카테고리의 다른 글
[Python/파이썬] 백준 16938번 캠프 준비 (0) | 2023.07.11 |
---|---|
[Python/파이썬] 백준 1711번 직각삼각형 (0) | 2023.07.09 |
[Python/파이썬] 백준 2748번 피보나치 수 2 (0) | 2023.02.09 |
[Python/파이썬] 백준 1747번 소수&팰린드롬 (0) | 2023.02.06 |
[Python/파이썬] 백준 2960번 에라토스테네스의 체 (0) | 2023.02.06 |
9655번: 돌 게임
상근이가 게임을 이기면 SK를, 창영이가 게임을 이기면 CY을 출력한다.
www.acmicpc.net
문제
돌 게임은 두 명이서 즐기는 재밌는 게임이다.
탁자 위에 돌 N개가 있다. 상근이와 창영이는 턴을 번갈아가면서 돌을 가져가며, 돌은 1개 또는 3개 가져갈 수 있다. 마지막 돌을 가져가는 사람이 게임을 이기게 된다.
두 사람이 완벽하게 게임을 했을 때, 이기는 사람을 구하는 프로그램을 작성하시오. 게임은 상근이가 먼저 시작한다.
입력
첫째 줄에 N이 주어진다. (1 ≤ N ≤ 1000)
출력
상근이가 게임을 이기면 SK를, 창영이가 게임을 이기면 CY을 출력한다.
코드
n = int(input()) if n % 2 == 0: print("CY") else: print("SK")
가져갈 수 있는 돌이 모두 홀수 개이므로 사실 복잡한 알고리즘도 필요없고 애초에 주어진 돌이 홀수 개냐 짝수 개냐 그것만 판단하면 문제를 아주 쉽게 풀 수 있다. 홀수 개의 돌이면 무조건 먼저 시작한 상근이가 이기고, 짝수 개의 돌이면 창영이가 이긴다.
하지만 이 문제는 다이나믹 프로그래밍을 연습하기 위한 문제였으므로 다이나믹 프로그래밍을 이용하여 풀어보겠다.
n = int(input()) dp = [0, 1, 2, 1] # n개의 돌이 있을 때 두 사람이 최소로 게임을 진행하는 횟수 if n >= 3: for i in range(3, n + 1): dp.append(min(dp[i-1], dp[i-3])) if dp[n] % 2 == 1: print("SK") else: print("CY")
dp 배열에는 n번째 원소에 n개의 돌이 있을 때 두 사람이 최소로 게임을 진행하는 횟수를 넣어줄 것이다. 그러기 위해서 최값으로는 [0, 1, 2, 1]을 넣어주었다. 이제 이 배열에 대해 반복문을 돌며 돌의 개수에 따른 두 사람의 최소 게임 횟수를 넣어줄 것이다.
최종적으로 우리가 입력받은 n개의 돌이 있을 때 두 사람이 최소 게임 횟수가 dp[n]의 값일 것이다. 이 값이 홀수라면 먼저 시작한 상근이, 짝수라면 창영이가 이긴 것이다.
'문제풀이 > 수학' 카테고리의 다른 글
[Python/파이썬] 백준 16938번 캠프 준비 (0) | 2023.07.11 |
---|---|
[Python/파이썬] 백준 1711번 직각삼각형 (0) | 2023.07.09 |
[Python/파이썬] 백준 2748번 피보나치 수 2 (0) | 2023.02.09 |
[Python/파이썬] 백준 1747번 소수&팰린드롬 (0) | 2023.02.06 |
[Python/파이썬] 백준 2960번 에라토스테네스의 체 (0) | 2023.02.06 |