[BOJ] 1063번_킹_구현 (C++)

ChangBeom·2024년 10월 7일

Algorithm

목록 보기
72/97

[문제]

https://www.acmicpc.net/problem/1063

8x8 크기의 체스판에 킹이 하나 있다. 체스판에서 말의 위치는 알파벳 하나와 숫자 하나로 이루어져 있는데, 알파벳은 열을 상징하고, 숫자는 행을 상징한다. 열은 가장 왼쪽이 A이고, 가장 오른쪽이 H이다. 행은 가장 아래가 1이고 가장 위가 8이다.

킹의 현재 위치가 주어지고, 킹은 다음과 같이 움직일 수 있다.

  • R : 한 칸 오른쪽으로
  • L : 한 칸 왼쪽으로
  • B : 한 칸 아래로
  • T : 한 칸 위로
  • RT : 오른쪽 위 대각선으로
  • LT : 왼쪽 위 대각선으로
  • RB : 오른쪽 아래 대각선으로
  • LB : 왼쪽 아래 대각선으로

체스판에는 돌이 하나 있는데, 돌과 같은 곳으로 이동할 때는, 돌을 킹이 움직인 방향과 같은 방향으로 한 칸 이동시킨다.

입력으로 킹이 어떻게 움직여야 하는지 주어진다. 입력으로 주어진 대로 움직여서 킹이나 돌이 체스판 밖으로 나갈 경우에는 그 이동은 건너 뛰고 다음 이동을 한다.

이때, 킹과 돌의 마지막 위치를 구하는 프로그램을 만드는 문제이다.

[사용 알고리즘]

구현

[풀이 핵심]

  • 열을 입력받을 때 알파벳으로 주어지는데, 이동을 처리할 때는 숫자로 바꿔서 처리하고, 모든 처리가 끝난 후에 답을 출력할 때 다시 알파벳으로 바꿔줘야한다.
  • 명령어로 입력된 방향쪽으로 킹이 이동했을 때 체스판을 벗어나는지 확인해주고, 체스판을 벗어나지 않는다면 이동한 킹이 돌과 겹치는지도 확인해야한다. 돌과 겹칠때는 돌이 이동했을 때 체스판을 벗어나지 않는다면 돌을 이동시켜주고 벗어난다면 돌과 킹을 이동하지 않으면 된다. 그 이외의 경우에는 킹을 이동시켜주면된다.

[코드]


//boj1063번_킹_구현

#include<iostream>

using namespace std;


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

int main() {
	char kX, rX;

	int kingX = 0, kingY;
	int rockX = 0, rockY;

	cin >> kX >> kingY;
	cin >> rX >> rockY;

	if (kX == 'A') {
		kingX = 1;
	}
	else if (kX == 'B') {
		kingX = 2;
	}
	else if (kX == 'C') {
		kingX = 3;
	}
	else if (kX == 'D') {
		kingX = 4;
	}
	else if (kX == 'E') {
		kingX = 5;
	}
	else if (kX == 'F') {
		kingX = 6;
	}
	else if (kX == 'G') {
		kingX = 7;
	}
	else if (kX == 'H') {
		kingX = 8;
	}

	if (rX == 'A') {
		rockX = 1;
	}
	else if (rX == 'B') {
		rockX = 2;
	}
	else if (rX == 'C') {
		rockX = 3;
	}
	else if (rX == 'D') {
		rockX = 4;
	}
	else if (rX == 'E') {
		rockX = 5;
	}
	else if (rX == 'F') {
		rockX = 6;
	}
	else if (rX == 'G') {
		rockX = 7;
	}
	else if (rX == 'H') {
		rockX = 8;
	}

	int N;
	cin >> N;

	int dir = 0;

	for (int i = 0; i < N; i++) {
		string cmd;
		cin >> cmd;

		if (cmd == "R") {
			dir = 0;
		}
		else if (cmd == "L") {
			dir = 1;
		}
		else if (cmd == "B") {
			dir = 2;
		}
		else if (cmd == "T") {
			dir = 3;
		}
		else if (cmd == "RT") {
			dir = 4;
		}
		else if (cmd == "LT") {
			dir = 5;
		}
		else if (cmd == "RB") {
			dir = 6;
		}
		else if (cmd == "LB") {
			dir = 7;
		}

		int next_kingX = kingX + dx[dir];
		int next_kingY = kingY + dy[dir];

		if (next_kingX > 0 && next_kingX <= 8 && next_kingY > 0 && next_kingY <= 8) {
			if (next_kingX == rockX && next_kingY == rockY) {
				int next_rockX = rockX + dx[dir];
				int next_rockY = rockY + dy[dir];

				if (next_rockX > 0 && next_rockX <= 8 && next_rockY > 0 && next_rockY <= 8) {
					rockX = next_rockX;
					rockY = next_rockY;

					kingX = next_kingX;
					kingY = next_kingY;
				}
			}
			else {
				kingX = next_kingX;
				kingY = next_kingY;
			}
			
		}
	}

	cout << (char)(kingX + '@') << kingY << '\n';
	cout << (char)(rockX + '@') << rockY;

	return 0;
}

0개의 댓글