[백준] 17122 체스

Python
avatar
2025.05.16
·
5 min read

문제

일반적인 모양의 8x8 체스판이 있다.

하나의 체스 판은 총 64개의 칸으로 이루어 지며 각 칸은 (1부터 8까지 표시된) 8개의 행과 (A부터 H까지 표시된) 8개의 열을 통해 구분이 가능하다. 아래 그림에서처럼 하나의 체스보드에는 정확히 32개의 검은 칸과 (가령 A1과 H8) 정확히 32개의 흰색 칸이 있다 (가령 H1과 A8). 

하나의 체스 칸을 표기하기 위해 아래와 같은 두 가지 방법을 사용할 수 있다.

  • 표기법 1: 해당 칸의 열 번호를 대문자로 적고 행 번호를 적는 방법 (예를 들어 “A1”, “D4”, “H8”)

  • 표기법 2: 해당 칸의 고유한 번호로 표현하는 방법 (아래 우측 그림에서 각 칸에 적혀있는 번호)

  • 6155
6155

위의 표기법을 이용하면 하나의 칸을 두 가지 다른 방법으로 표현할 수 있다. 가령 “A3” 와 “17”은 같은 칸을 가리킨다 (검은 색). 다른 예로, “38”과 “F5”은 같은 칸을 가리킨다 (흰 색). 

표기법 1로 표현된 칸과 표기법 2로 표현된 칸이 주어졌을 때, 이 두 칸이 같은 색인지 아닌지 판단하는 프로그램을 작성하시오. 


입력

첫 줄에 테스트 케이스의 수 T가 주어진다 (1 <= T <= 10).

각 테스트 케이스는 한 줄에 두 개의 칸을 표현하는 문자열 하나와 수 하나로 주어진다 - 항상 표기법 1로 표현된 칸이 먼저 주어지고 공백이 하나 주어진 후 표기법 2로 표현된 칸이 주어진다.

(표기법 1로 표현된) 문자열은 언제나 길이가 2이며 첫 글자는 영대문자 A-H중 하나이며 두 번째 글자는 숫자 1-8중 하나이다. (표기법 2로 표현된) 수는 언제나 1이상 64이하의 정수이다.

잘못된 입력이 주어지는 경우는 없다고 가정해도 된다.


출력

각 테스트 케이스에 대해, 주어진 두 칸이 같은 색이면 “YES”를, 아니면 “NO”를 출력하시오 (따옴표는 제외). 


내 풀이

t = int(input())

for _ in range(t):
    str1, str2 = input().split()
    
    if str1[0] == 'A' or str1[0] == 'C' or str1[0] == 'E' or str1[0] == 'G':
        if int(str1[1])%2 == 0:
            check1 = 'white'
        else:
            check1 = 'black'
            
    else:
        if int(str1[1])%2 == 0:
            check1 = 'black'
        else:
            check1 = 'white'
            
    a, b = int(str2)//8, int(str2)%8   # a+1 -> row , b -> column
    
    if b == 0:
        if a%2 == 1:
            check2 = 'white'
        else:
            check2 = 'black'
        
    else:
        if b%2 == 1:     #  A, C, E, G
            if (a+1)%2 == 1:
                check2 = 'black'
            else:
                check2 = 'white'
        else:
            if (a+1)%2 == 1:
                check2 = 'white'
            else:
                check2 = 'black'
    
    if check1 == check2:
        print('YES')
    else:
        print('NO')

코멘트

표기법 2처럼 고유한 번호에서 몇 행 몇 열인지 판단해서 어떤 색의 칸인지 알아볼 때, 8의 배수인 경우를 조심해야 한다. 8의 배수인 경우에는 (8로 나눈 몫 + 1)이 아니라 (8로 나눈 몫)이 행의 번호가 되기 때문이다.

사실 이렇게 복잡할 필요 없이 (행 + 열)%2 = 홀수이면 흰색, 짝수면 검은색임을 이용하면 된다고 한다...


References

https://www.acmicpc.net/problem/17122







- 컬렉션 아티클