Algorithm/문제 풀이

[백준] 1063번: 킹 (C++)

잭희 2023. 9. 24. 20:30

문제


문제링크: https://www.noj.am/1063

 

1063번: 킹

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

www.acmicpc.net

 

문제 분석


 

이 문제를 풀기위해서 체스?

몰라도 된다.


그냥 상하좌우대각 8방향으로 1칸씩 움직이는 게 끝이니까

킹을 움직여주는 게 끝인 간단한 문제인데,

 

여기서 킹받는 포인트는 돌이랑 겹칠 때,

그리고 체스판 밖으로 나갈 때를 고려해줘야 한다는 것이다.

 

근데 생각해보면 그것도 간단하다

사실 별로 킹 안 받음

 

겹칠 때의 상황도 문제에서 아주 잘 보여주고 있잖아



필요한 것 목록.

1. 킹과 돌의 x, y좌표 (행/열)

2. 이차원 배열? 만들 필요 없다~

 

체스판 모양대로 이차원 배열을 만들어야 하나?

NOPE.

어차피 돌과 겹치는지, 체스판 밖으로 나가는 지는
결국 좌표 값만 있으면 된다는 것 아닌가?!

그러니 체스판은 머리 속에 넣어두고 x, y 방향만 헷갈리지 않으면 된다!

 

물론 머리 속에 체스판이고 뭐고 감이 잡히지 않을 수 있다.

그래도 이차원 배열 쓰지 말고 한번 종이에 직접 그려보면서 이해해보자

그럼 이해하는 데에 훨씬 도움이 될 것이다.



자세한 풀이


먼저 킹과 돌의 위치를 입력받고 횟수만큼 움직임을 문자열로 입력을 받는다.

킹과 돌의 위치는 문자 부분숫자 부분을 나눠서 저장해두고,
[아스키코드상 'A': 65, '0': 48이니까 참고]

 

입력받는 움직임 중 좌·우로는 대각선 방향도 있으므로,
문자열의 첫 문자가 'L'이거나 'R'일 때는 뒤의 문자 유무를 판단해준다.

이건 switch() 구문으로 나눠주면 깔끔하다고 생각했다.

움직임을 입력받는 문자열을 M이라고 하면,
switch(M[0])을 통해 문자열의 첫 부분만으로 나눠줄 수 있으니까

 

1. 그리곤 킹의 위치를 옮겼을 때 체스판을 넘어가거나

2. 돌이 있어서 돌도 옮겨야하고

3. 옮긴 돌이 체스판을 넘어갈 수도 있다.

 

이 세 가지 상황들만 조건문을 통해 잘 고려해주면??

 

짜-잔 또 문제 하나 해결~

너무 간단하죠

 

코드 (C++)


#include <bits/stdc++.h>
using namespace std;

int N; // 이동 횟수 
string K, S, M; // 킹, 돌, 이동 정보 


int main() {
    ios_base::sync_with_stdio(0); cin.tie(0);
    cin >> K >> S >> N;
    
    int kx=K[0]-64, ky=K[1]-48;
    int sx=S[0]-64, sy=S[1]-48;
    
	while(N--){
		cin >> M;
		int mx=0, my=0;
		
		switch(M[0]){
			case 'R':
				mx=1;
				if(M[1]=='T')my=1;
				if(M[1]=='B')my=-1;
				break;
			case 'L':
				mx=-1;
				if(M[1]=='T')my=1;
				if(M[1]=='B')my=-1;
				break;
			case 'B':
				my=-1;
				break;
			case 'T':
				my=1;
				break;
		}
		
		int cur_kx=kx+mx, cur_ky=ky+my;
		int cur_sx=sx+mx, cur_sy=sy+my;
		
		if(cur_kx<1||cur_kx>8||cur_ky<1||cur_ky>8)continue;
		if(cur_kx==sx&&cur_ky==sy){
			if(cur_sx<1||cur_sx>8||cur_sy<1||cur_sy>8)continue;
			sx=cur_sx, sy=cur_sy;
		}
		kx=cur_kx, ky=cur_ky;
	}
	cout << (char)(kx+64) << ky << '\n';
	cout << (char)(sx+64) << sy;
}

 

코드를 봐도 잘 이해 안 되면 댓글로 물어보세요