ps | |
---|---|
링크 | acmicpc.net/… |
출처 | BOJ |
문제 번호 | 1542 |
문제명 | 체스 연습 |
레벨 | 플래티넘 1 |
분류 |
게임 이론 |
시간복잡도 | O(x*y*(x+y) + n) |
인풋사이즈 | x<=100, y<=100, n<=50 |
사용한 언어 | Python 3.11 |
제출기록 | 34200KB / 192ms |
최고기록 | 192ms |
해결날짜 | 2023/07/12 |
"""Solution code for "BOJ 1542. 체스 연습".
- Problem link: https://www.acmicpc.net/problem/1542
- Solution link: http://www.teferi.net/ps/problems/boj/1542
Tags: [game theory]
"""
import functools
import operator
INF = float('inf')
def compute_game():
grundy = [[0] * 100 for _ in range(100)]
for i in range(100):
grundy[i][i] = INF
for r in range(1, 100):
for c in range(r + 1, 100):
next_grundy_nums = set()
for nr in range(1, r):
next_grundy_nums.add(grundy[nr][c])
for nc in range(1, c):
next_grundy_nums.add(grundy[r][nc])
for nr, nc in zip(range(r - 1, 0, -1), range(c - 1, 0, -1)):
next_grundy_nums.add(grundy[nr][nc])
grundy[r][c] = grundy[c][r] = next(
i for i in range(300) if i not in next_grundy_nums
)
return grundy
def main():
grundy = compute_game()
for _ in range(5):
N = int(input())
X_and_Y = [[int(x) for x in input().split()] for _ in range(N)]
if any(x == y or x == 0 or y == 0 for x, y in X_and_Y):
print('S')
continue
tot_grundy = functools.reduce(
operator.xor, (grundy[x][y] for x, y in X_and_Y)
)
print('S' if tot_grundy > 0 else 'D')
if __name__ == '__main__':
main()