작성일 :

문제 링크

17122번 - 체스

설명

8 × 8 크기의 체스판 위에 두 칸이 주어졌을 때, 두 칸이 같은 색인지 판별하는 문제입니다.

한 칸은 열과 행으로 구성된 표기(A1, H8) 로 주어지고, 다른 한 칸은 1부터 64까지 매겨진 고유 번호 로 주어집니다.

입력으로 주어진 두 칸이 체스판 위에서 같은 색인지에 대한 여부를 판단하여 "YES" 또는 "NO" 를 출력합니다.


체스판에서는 각 칸의 색열 번호행 번호 를 기준으로 결정할 수 있습니다.

열과 행 번호를 더한 값짝수 이면 흰색, 홀수 이면 검은색 이 됩니다.

따라서, 주어진 칸을 열과 행 좌표로 변환한 뒤, 이 규칙을 적용해 색을 판단할 수 있습니다.


접근법

  • 문자열로 주어진 칸은 첫 번째 문자를 이용해 열 번호를 정하고, 두 번째 문자를 이용해 행 번호를 정합니다.
  • 번호로 주어진 칸8 로 나눈 나머지를 통해 열을 결정하고, 8로 나눈 몫을 통해 행을 결정합니다.
  • 이후 두 칸의 열과 행 번호를 합산하여 색을 판별한 뒤 두 칸의 색이 같은지 비교합니다.

Code

C#

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using System;

class Program {
  static void Main() {
    int t = int.Parse(Console.ReadLine());

    for (int i = 0; i < t; i++) {
      var parts = Console.ReadLine().Split();
      string s = parts[0];
      int n = int.Parse(parts[1]);

      int x1 = s[0] - 'A';
      int y1 = s[1] - '1';
      int x2 = (n - 1) % 8;
      int y2 = (n - 1) / 8;

      Console.WriteLine(((x1 + y1) % 2 == (x2 + y2) % 2) ? "YES" : "NO");
    }
  }
}

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <bits/stdc++.h>

using namespace std;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  int t; cin >> t;
  while (t--) {
    string s; int n; cin >> s >> n;

    int x1 = s[0] - 'A', y1 = s[1] - '1';
    int x2 = (n - 1) % 8, y2 = (n - 1) / 8;

    cout << (((x1 + y1) % 2 == (x2 + y2) % 2) ? "YES" : "NO") << "\n";
  }

  return 0;
}