Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++로 비숍(Bishop)이 한 번의 이동으로 방문할 수 있는 칸의 총 개수 계산하기

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

C++로 비숍(Bishop)이 한 번의 이동으로 방문할 수 있는 칸의 총 개수 계산하기

입력 및 출력 예시

예시 1

입력:

row = 5, column = 4

출력:

비숍이 한 번의 이동으로 방문할 수 있는 칸의 개수: 13

설명: 비숍이 (5, 4) 위치에 있으면 네 개의 대각선 방향으로 각각 3칸, 3칸, 3칸, 4칸씩 이동할 수 있으므로 전체 13칸을 커버할 수 있습니다.

예시 2

입력:

row = 1, column = 1

출력:

비숍이 한 번의 이동으로 방문할 수 있는 칸의 개수: 7

설명: (1, 1)은 체스판의 맨 끝 모서리이므로 비숍은 한쪽 대각선(오른쪽 아래 방향)만 사용할 수 있습니다. 해당 대각선에는 최대 7개의 칸이 존재합니다.

풀이 접근 방식

이 문제는 체스판의 경계, 즉 행과 열의 최솟값·최댓값을 활용해 각 대각선 방향별로 이동 가능한 칸 수를 계산하는 방식으로 해결할 수 있습니다. 구체적인 단계는 다음과 같습니다.

  • 비숍의 위치를 나타내는 두 정수 rowcolumn을 입력받습니다.
  • 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) 시간 복잡도로 답을 구할 수 있다는 장점이 있습니다.