8×8 격자 형태의 체스판 위에서 비숍(Bishop)의 위치가 행(row)과 열(column) 좌표로 주어집니다. 이 글의 목표는 비숍이 한 번의 이동으로 방문할 수 있는 칸의 총 개수를 구하는 것입니다. 체스 규칙에 따르면 비숍은 대각선 방향, 즉 왼쪽 위·아래, 오른쪽 위·아래 네 방향으로 원하는 만큼 이동할 수 있습니다.

입력 및 출력 예시
예시 1
입력:
row = 5, column = 4
출력:
비숍이 한 번의 이동으로 방문할 수 있는 칸의 개수: 13
설명: 비숍이 (5, 4) 위치에 있으면 네 개의 대각선 방향으로 각각 3칸, 3칸, 3칸, 4칸씩 이동할 수 있으므로 전체 13칸을 커버할 수 있습니다.
예시 2
입력:
row = 1, column = 1
출력:
비숍이 한 번의 이동으로 방문할 수 있는 칸의 개수: 7
설명: (1, 1)은 체스판의 맨 끝 모서리이므로 비숍은 한쪽 대각선(오른쪽 아래 방향)만 사용할 수 있습니다. 해당 대각선에는 최대 7개의 칸이 존재합니다.
풀이 접근 방식
이 문제는 체스판의 경계, 즉 행과 열의 최솟값·최댓값을 활용해 각 대각선 방향별로 이동 가능한 칸 수를 계산하는 방식으로 해결할 수 있습니다. 구체적인 단계는 다음과 같습니다.
- 비숍의 위치를 나타내는 두 정수
row와column을 입력받습니다. squares_visited(int first, int second)함수는 비숍의 위치를 인자로 받아 한 번의 이동으로 방문할 수 있는 칸 수를 반환합니다.count변수를 0으로 초기화합니다.- 왼쪽 위 대각선(
min_left):min(row, column) - 1 - 왼쪽 아래 대각선(
max_left):8 - max(row, 9 - column) - 오른쪽 아래 대각선(
max_right):8 - max(row, column) - 오른쪽 위 대각선(
min_right):min(row, 9 - column) - 1 - 총 방문 가능한 칸 수는 위 네 값의 합입니다.
- 계산된
count를 결과로 반환합니다.
C++ 구현 예제
#include <bits/stdc++.h>
using namespace std;
int squares_visited(int first, int second){
int count = 0;
int min_left = min(first, second) - 1;
int max_left = 8 - max(first, 9 - second);
int max_right = 8 - max(first, second);
int min_right = min(first, 9 - second) - 1;
count = min_left + min_right + max_right + max_left;
return count;
}
int main(){
int row = 3, column = 3;
cout << "비숍이 한 번의 이동으로 방문할 수 있는 칸의 개수: " << squares_visited(row, column);
return 0;
}
실행 결과
위 코드를 실행하면 다음과 같은 출력이 생성됩니다.
비숍이 한 번의 이동으로 방문할 수 있는 칸의 개수: 11
예를 들어 비숍이 (3, 3)에 있을 경우 네 대각선 방향으로 각각 2칸, 2칸, 5칸, 2칸씩 이동할 수 있으므로 합계 11칸이 됩니다. 이처럼 경계까지의 거리를 최솟값·최댓값 연산으로 구하면 반복문 없이도 O(1) 시간 복잡도로 답을 구할 수 있다는 장점이 있습니다.