문제


문제링크: 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;
}

코드를 봐도 잘 이해 안 되면 댓글로 물어보세요
'Algorithm > 문제 풀이' 카테고리의 다른 글
[백준] 4485번: 녹색 옷 입은 애가 젤다지? (C++) (3) | 2024.03.06 |
---|---|
[백준] 25945: 컨테이너 재배치 (C / C++) (1) | 2023.10.08 |
[백준] 2630번: 색종이 만들기 (C++) (0) | 2023.08.16 |
[백준] 12789번: 도키도키 간식드리미 (C++) (0) | 2023.08.14 |
[백준] 11478번: 서로 다른 부분 문자열의 개수 (C++) (0) | 2023.08.13 |