본문 바로가기
C++ 코딩 문제 풀이/백준

[Baekjoon] 1063번: 킹

by 섬댕이 2023. 12. 5.

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

 

1063번: 킹

8*8크기의 체스판에 왕이 하나 있다. 킹의 현재 위치가 주어진다. 체스판에서 말의 위치는 다음과 같이 주어진다. 알파벳 하나와 숫자 하나로 이루어져 있는데, 알파벳은 열을 상징하고, 숫자는

www.acmicpc.net

 


 

문제 해결 과정

착안

킹을 움직였을 때, 돌과 위치가 겹쳐지는지의 여부에 따라 조건문 분기를 처리하는 데에 주의하여 문제에서 주어진 조건을 구현하고자 하였다.

 

구현

킹과 돌을 나타내는 구조체를 만들어 이동을 위한 메서드를 정의할 때 먼저 이동 여부를 판단하고, 이동 가능하다면 해당 위치로 이동시키는 메서드를 구현하였다.

 

이때 킹 또는 돌이 체스판 밖으로 밀려나는 경우는 이동을 수행하지 않으므로, 편의상 원위치로 되돌아가는 코드를 구현하지 않고 킹과 돌을 나타내는 임시 지역변수를 하나씩 선언하여 처리하는 방법으로 구현하였다.

 

[스포 주의] 아래 '더보기'를 누르면 코드가 나오니 주의하세요~

더보기
#include <iostream>
#include <string>

using namespace std;

const int Size = 8;

struct Position
{
	int X;
	int Y;
};

struct ChessPiece
{
	string Pos;

	bool Move(Position pos)
	{
		char x = Pos[0] + pos.X;
		if (x < 'A' || x > 'H')
			return false;

		char y = Pos[1] + pos.Y;
		if (y < '1' || y > '8')
			return false;

		Pos[0] = x;
		Pos[1] = y;
		return true;
	}

	bool operator ==(const ChessPiece& other) const
	{
		return Pos == other.Pos;
	}
};

int main()
{
	ChessPiece King, Stone;
	string input;
	int Moves;

	cin >> King.Pos >> Stone.Pos >> Moves;

	while (Moves--)
	{
		ChessPiece tempKing{ King.Pos };
		ChessPiece tempStone{ Stone.Pos };
		Position d;

		cin >> input;
		if (input == "R")  d = {  1,  0 };
		if (input == "RB") d = {  1, -1 };
		if (input == "B")  d = {  0, -1 };
		if (input == "LB") d = { -1, -1 };
		if (input == "L")  d = { -1,  0 };
		if (input == "LT") d = { -1,  1 };
		if (input == "T")  d = {  0,  1 };
		if (input == "RT") d = {  1,  1 };

		if (tempKing.Move(d))
		{
			if (tempKing == tempStone)
			{
				if (tempStone.Move(d))
					Stone.Move(d);
				else
					continue;
			}

			King.Move(d);
		}
	}

	cout << King.Pos << "\n" << Stone.Pos << "\n";
}

 

실행 결과

'C++ 코딩 문제 풀이 > 백준' 카테고리의 다른 글

[Baekjoon] 동전 뒤집기  (0) 2023.12.09
[Baekjoon] 9084번: 동전  (1) 2023.12.07
[Baekjoon] 10830번: 행렬 제곱  (0) 2023.12.04
[Baekjoon] 1068번: 트리  (0) 2023.12.01
[Baekjoon] 1012번: 유기농 배추  (0) 2023.08.24

댓글