백준 32208 - Knight Cruising (Python)

cl2380·2025년 12월 10일

백준 문제풀이

목록 보기
15/37

문제 정보


문제 정리

3차원 좌표 공간 (0, 0, 0)위에 나이트가 놓여 있다. 이 나이트는 x, y, z 좌표 중 하나는 ±1\pm1, 다른 하나는 ±2\pm2, 나머지 하나는 ±3\pm3만큼 변화시키는 방식으로 이동할 수 있다. 이 때, 나이트가 주어지는 좌표에 접근할 수 있는지를 판단하는 쿼리를 N개 처리해야 한다.


풀이

내가 생각한 풀이는 다음과 같다.
나이트의 첫 위치가 (0, 0, 0)이고, 이 칸을 흰색 칸이라고 가정하자.
나이트가 2회 움직여서 도착한 좌표의 경우를 전부 살펴보면,

  1. 도착한 좌표 % 6 == 0일 경우,
    • 가능한 이동 (1, -1), (2, -2), (3, -3), (-3, -3)이다. 이 좌표들은 전부 x, y로 어떻게 이동하든 출발한 칸과 같은 색 칸에 도착하게 된다.
  2. 도착한 좌표 % 6 == 1일 경우,
    • 가능한 이동 (2, -1), (3, -2), (-2, -3)이다. 이 좌표들은 전부 x, y로 어떻게 이동하든 출발한 칸과 다른 색 칸에 도착하게 된다.
  3. 도착한 좌표 % 6 == 2일 경우,
    • 가능한 이동 (1, 1), (-2, -2), (3, -1), (-1, -3)이다. 이 좌표들은 전부 x, y로 어떻게 이동하든 출발한 칸과 같은 색 칸에 도착하게 된다.

...

이런 과정으로 1, 2, 3, 4, 5, 6에 대해 처리를 해보면 도착한 좌표로 나눈 나머지가 짝수일 경우는 같은색 칸에, 홀수인 경우는 다른색 칸에 도착하게 된다. 즉,

  1. z가 짝수일 경우, x+y가 짝수이면 도달 가능.
  2. z가 홀수일 경우 x+y가 홀수이면 도달 가능.
  3. 이외의 경우는 전부 도달 불가.

로 정리할 수 있고 이걸 그대로 코드로 구현해서 풀었다.


잘못된 방법으로 시도했다 받은 무수한 WA의 흔적...
아 이거 잘 풀었다 하고 기여창을 봤는데

이런게 있었다... 나는 그동안 뭘 한것인가...
잘 생각해보니 내가 내린 결론 중에 "z가 홀수일 경우 x+y가 홀수이면 도달 가능." 이건 x+y+z가 홀수인 지점에서 출발할 경우에만 True가 될 수 있는 if문이라 작성할 필요가 없었다.


코드

# 백준 32208

import io

input = io.BufferedReader(io.FileIO(0), 1<<18).readline


def solve(x, y, z):
    if z % 2 == 0 and (x+y) % 2 == 0:
        return 'YES'
    elif z % 2 == 1 and (x+y) % 2 == 1:
        return 'YES'
    return 'NO'


def main():
    N = int(input())
    for _ in range(N):
        x, y, z = map(int, input().split())
    
        print(solve(x, y, z))


main()

0개의 댓글