====== 왕들의 외나무다리 돌게임 ====== ===== 풀이 ===== * 규칙에서 파악해야 할것은 뒤로 이동해서 상태가 더 좋아지는 경우는 없다는 것이다. 내가 뒤로 n칸 이동하면 상대는 다음턴에 앞으로 n칸 이동할수 있고, 그러면 원래 상태로 되돌아간다. 따라서 뒤로 이동하는 움직임을 배제하고 생각하면, 결국 상대와 나 사이에 빈 칸이 n개일때, k칸 앞으로 이동하는 것은, 돌이 n개 있는 무더기에서 k개를 가져가는 것과 동일하므로 님게임과 똑같이 분석하면 된다. * [[ps::스프라그-그런디 정리]]를 이용해서, 각 다리의 그런디수를 구한뒤 xor해서 전체 그런디 수를 구하면 된다. 그런디 수는 상대와 나 사이의 빈칸의 갯수이므로, 총 갯수가 n칸인 다리에서 양 끝에 있는 경우 (시작 포지션)의 그런디 수는 n-2가 된다. * n개의 다리에 대해서 그런디 수를 모두 구해서 xor하는 데에 걸리는 시간복잡도는 O(n)이다 ===== 코드 ===== """Solution code for "BOJ 18937. 왕들의 외나무다리 돌게임". - Problem link: https://www.acmicpc.net/problem/18937 - Solution link: http://www.teferi.net/ps/problems/boj/18937 Tags: [Sprague-Grundy] """ def main(): N = int(input()) # pylint: disable=unused-variable A = [int(x) for x in input().split()] first_player = input() second_player = 'Blackking' if first_player == 'Whiteking' else 'Whiteking' grundy = 0 for a_i in A: grundy ^= a_i - 2 print(first_player if grundy > 0 else second_player) if __name__ == '__main__': main() {{tag>BOJ ps:problems:boj:플래티넘_3}}