본문 바로가기
코테/구현

[C/C++] 나동빈 왕실의 나이트, 구현

by 상똥 2023. 2. 15.

문제

체스에서 말이 움직이는 방법은 아래와 같다.
- 수직으로 두 칸 이동 후 수평으로 한 칸 이동
- 수평으로 두 칸 이동 후 수직으로 한 칸 이동
체스에서 말의 위치가 입력될 때, 체스판 안에서 움직일 수 있는 경우의 수를 구하시오 

코드

#include <iostream>

using namespace std;

int dx[] = { 1, 1, -1, -1, 2, 2, -2, -2 };
int dy[] = { 2, -2, 2, -2, 1, -1, 1, -1 };

int main() {
	string position;
	cin >> position;
	int x = position[0] - 96, y = position[1] - 48, cnt = 8;

	for (int i = 0; i < 8; i++)
		if ((x + dx[i] > 8) || (x + dx[i] < 1) || (y + dy[i] > 8) || (y + dy[i] < 1))
			cnt--;
	
	cout << cnt;
}

풀이

1. 배열 dx와 dy에 말이 x축, y축으로 움직일 수 있는 방향을 서로의 인덱스에 맞게 입력한다.

2. 처음 위치를 position에 입력받고 아스키코드를 활용해 위치를 인덱스로 바꾸어 x, y에 저장한다.

3. 움직일 수 있는 최대치의 경우의 수는 8이므로 cnt에 8을 저장한다.

4. x와 y에 dx, dy의 원소를 하나씩 더해 그 값이 체스판에서 벗어나면 cnt를 감소시킨다.