켠김에 왕까지/이것이 코딩테스트다

[이것이 코딩테스트다] 왕실의 나이트 (C++)

선돌이 2021. 2. 5. 23:11
728x90

 

행복 왕국의 왕실 정원은 체스판과 같은 8 x 8좌표 평면이다.
왕실 정원의 특정한 한 칸에 나이트가 서있다. 나이트는 매우 충성스러운 신하로서 매일
무술을 연마한다.
나이트는 말을 타고 있기 때문에 이동을 할때는 L자 형태로만 이동할 수 있으며 정원 밖으로는 나갈 수 없다. 나이트는 특정한 위치에서 다음과 같은 2가지 경우로 이동할 수 있다.

  1. 수평으로 두 칸 이동한 뒤에 수직으로 한 칸 이동하기
  2. 수직으로 두 칸 이동한 뒤에 수평으로 한 칸 이동하기

이처럼 8 x 8 좌표 평면상에서 나이트의 위치가 주어졌을 때 나이트가 이동할 수 있는 경우의 수를 출력하는 프로그램을 작성하시오. 이떄, 왕실의 정원에서 행 위치를 표현할 떄는 1부터 8로 표현하며, 열 위치를 표현할 때는 a부터 h로 표현한다.

예를 들어 만약 나이트가 a1에 있을 때 이동할 수 있는 경우의 수는 다음 2가지이다.
a1의 위치는 좌표 평면에서 구석의 위치에 해당하며 나이트는 정원의 밖으로는 나갈 수 없기 때문이다.

  1. 오른쪽 두 칸 이동 후 아래로 한 칸 이동하기(c2)
  2. 아래로 두 칸 이동 후 오른쪽으로 한 칸 이동하기(b3)

또 다른 예로 나이트가 c2에 위치해 있다면 나이트가 이동할 수 있는 경우의 수는 6가지이다.

 

-입력조건
첫째 줄에 8 x 8 좌표 평면상에서 현재 나이트가 위치한 곳의 좌표를 나타내는 두 문자로 구성된 문자 열이 입력된다. 입력문자는 a1처럼 열과 행으로 이뤄진다.

 

-출력조건
첫째 줄에 나이트가 이동할 수 있는 경우의 수를 출력하시오.

 

 


  • 소스코드
#include <iostream>
#include <string>
using namespace std;

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

int main() {
	string input;
	cin >> input;
	int row = input[1] - '0'; //숫자 모양 문자열을 숫자로 바꾸려면 아스키코드 0을 빼주면 됨!
	int col = input[0] - 'a' + 1; // 열은 1~8 사이지만 행은 a~h 사이니까 +1!!!!

	int cnt = 0;
	for (int i = 0; i < 8; i++) {
		int newrow = row + dx[i];
		int newcol = col + dy[i];

		if (newrow >= 1 && newrow <= 8 && newcol >= 1 && newcol <= 8)
			cnt++;
	}

	cout << cnt;
	return 0;

}

 

  • 컴린이의 소감

먼저 생각치도 못했던 부분은 문자열을 정수형으로 바꿔주는 부분이다. 이 부분은 이번에 한 번 경험했으니 다음번엔 잘 할 수 있을 것 같다. 제일 헷갈려서 애 먹었던 부분은 dx,dy!!!! 앞으로 자주 나온다고해서 이번에 제대로 익히려고 노력했다.

처음에 row에 dy를, col에 dx를 더했더니 틀린 결과가 나왔다. 혹시나 해서 두개를 바꿔봤더니 이번엔 정답이 나왔다.

row가 y축이고 col이 x축 아닌가? 계속 혼자 끙끙 생각해봤는데 체스판을 2차원 배열이라고 했을 때 행우선이기 때문에 a1 = (0,0) b1 = (0,1) .... 로 계산되어 row에 dx를 더하고 col에 dy를 더해야 한다는 결론을 도출하였다. 제 결론이 틀린거라면 댓글로 부탁드려요 흑흑

아직 많이 부족하고 더 피나는 노력이 필요하다는 생각이 드는 문제였다

728x90