목차

체스 연습

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()