BOJ-10837 동전 게임
https://www.acmicpc.net/problem/10837
문제 소개
게임의 라운드 수 k
가 주어졌을 때, 입력되는 m
, n
이 영희와 동수의 점수가 될 수 있는지 판별하는 문제이다.
문제 풀이
아래와 같이 세 경우로 나누어 생각한다. 주어진 m
과 n
이 가능한 점수이려면 점수가 m, n
이 되기 전의 이전 점수가 문제의 3번 규칙을 만족해야 한다. 3번 규칙을 만족하지 못한다면 게임이 바로 끝나게 되어 점수가 m, n
이 되지 못하기 때문이다.
m
과n
이 같은 경우 : 영희와 동수 둘 중 한명만 득점하는 라운드가 없음을 의미하므로 1을 반환한다.m
이n
보다 큰 경우 : 이전 점수에서의(m과 n의 차이) > (동수의 남은 기회)
라면 0을 반환하고 그렇지 않다면 1을 반환한다.m
이n
보다 작은 경우 : 이전 점수에서의(m과 n의 차이) > (영희의 남은 기회)
라면 0을 반환하고 그렇지 않다면 1을 반환한다.
2번과 3번 경우 이전 점수에서의 (m과 n의 차이)
는 (max(m, n) - 1) - min(m, n)
으로 같다.
매 라운드 항상 영희가 먼저 동전을 던지므로 (동수의 남은 기회)
와 (영희의 남은 기회)
는 조금 달라진다.
(동수의 남은 기회)
: 영희의 점수가m
으로 갱신되는 순간은 라운드가 진행 중이다. 동수는 최대k - (m - 1)
번의 기회를 갖는다. 영희가 점수m
을 얻은 라운드에 동수도 점수를 1점 얻을 수 있는 가능성이 있기 때문이다.(영희의 남은 기회)
: 동수의 점수가n
으로 갱신되며 라운드가 끝난다. 그리고 영희는 최대k - n
번의 기회를 갖는다.
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import sys
input = lambda: sys.stdin.readline().rstrip()
def score(m, n):
if m == n:
return 1
elif m > n:
if (m - 1) - n > k - (m - 1):
return 0
else:
return 1
else: # m < n
if (n - 1) - m > k - n:
return 0
else:
return 1
k = int(input())
c = int(input())
for _ in range(c):
m, n = map(int, input().split())
print(score(m, n))