@@@ 알고리즘/백준 스터디

16884(나이트 게임) - 해결 - 이유 찾음

HTG 2021. 11. 7. 11:15
728x90

나이트 게임

 

문제

나이트 게임은 크기가 N×N인 체스판 위에서 진행되는 게임이고, 나이트를 하나씩 턴을 번갈아가며 놓는 게임이다.

나이트는 이미 놓여져 있는 나이트가 공격할 수 있는 칸에 놓을 수 없다. 나이트를 (r, c)에 놓은 경우에는 (r-2, c+1), (r-1, c+2), (r+1, c+2), (r+2, c+1), (r+2, c-1), (r+1, c-2), (r-1, c-2), (r-2, c-1)이 공격할 수 있는 칸이다.

나이트를 놓을 수 있는 칸이 없는 사람이 게임을 지게 된다. 구사과와 큐브러버가 이 게임을 최적의 방법으로 플레이했을 때, 이기는 사람을 구하는 프로그램을 작성하시오. 게임은 구사과가 먼저 시작한다.

 

입력

첫째 줄에 테스트 케이스의 개수 T(1 ≤ T ≤ 100)가 주어진다. 둘째 줄부터 T개의 줄에 테스트 케이스가 한 줄에 하나씩 주어지며, 체스판의 크기 N(1 ≤ N ≤ 10,000)으로 이루어져 있다.

 

출력

각각의 테스트 케이스마다 게임을 이기는 사람을 출력한다. 구사과가 이기는 경우에는 "koosaga", 큐브러버가 이기는 경우에는 "cubelover"를 출력한다.


처음에는 어떻게 풀지 몰라서 그냥 무작정 그려서 풀어 보았다. 

그런데 풀다보니 선공, 후공, 선공, 후공 순으로 이기게 되는 것이였다.

그래서 맞은 사람의 코드 길이를 보니 짧은 것을 보았다. 그래서 N이 짝수이면 후공, 홀수이면 선공으로 풀이를 했더니 맞았다.

그래서 이유를 찾아 보았는데 핵심은 "점대칭"이 핵심이였다.

더보기

점대칭(點對稱)은 한 도형을 한 점 (대칭의 중심) 주위로 180° 회전했을 때, 본래의 도형에 완전히 겹치는 대칭을 말한다.

이 처럼 점대칭을 활용하여 상대가 놓은 곳에 점대칭한 자리에 놓으면 상대와 겹치지 않게 똑같은 갯수의 자리를 채울수 있다. 그렇게 되면 선공, 후공을하면 짝수개의 자리가 차지된다.

그렇다면 N이 짝수이면 총 자리가 짝수이기 때문에 선공이 지게된다.

N이 홀수이면 선공이 가운데 놓게되면 홀수개의 자리를 차지하게되기 때문에 총 짝수개의 자리가 남게 되고 후공이 먼저 시작하게 되기때문에 선공이 이기게 되는 방식이다.

import sys
input = sys.stdin.readline

T = int(input())

for _ in range(T):
    N = int(input())

    if N % 2:
        print('koosaga')
    else:
        print('cubelover')

 

'@@@ 알고리즘 > 백준 스터디' 카테고리의 다른 글

3107(IPv6) - 해결  (0) 2021.11.14
9660(돌 게임 6) - 해결  (0) 2021.11.14
17144(미세먼지 안녕!) - 해결  (0) 2021.11.06
22965(k개의 부분 배열) - 참고 - 해결  (0) 2021.11.04
14719(빗물) - 해결  (0) 2021.11.04