[백준] 1063 킹 C++알고리즘/백준2026. 1. 23. 11:48
Table of Contents


해설 및 풀이
문제를 잘 읽어야한다.
킹이 움직이고 돌과 부딪히면 돌을 해당 방향으로 옮기는 문제이다. 돌과 같이 움직이지 않는다.
(첫 트에 돌도 킹과 같이 움직인다고 판단해서 시간이 걸렸다)
또한 1행 1열 부터 시작하는게 아니라서 위와 아래에 대한 방향을 뒤집는 부분을 신경써야한다.
입력받는 방향(문자열)을 pair<int, int> 행과 열로 변경하는 부분에 대해서 배열을 만들어 빠르게 컨버팅 할 수 있는 기능들 또한 필요하다.
나머지 이동과 관련된 부분은 문제 그대로 이동을 시키고 범위 확인을 해주면 된다.
코드
#include <iostream>
#include <string>
#include <queue>
#include <map>
#include <algorithm>
#include <stack>
#include <sstream>
#include <set>
#include <unordered_set>
#include <cmath>
using namespace std;
using ll = long long;
const int MAX = 10;
string king, stone;
int cnt;
string dirConvert[8] = { "R", "L", "B", "T", "RT", "LT", "RB", "LB" };
pair<int, int> dirPair[8] = { {0, 1}, {0, -1}, {-1, 0}, {1, 0},
{1, 1}, {1, -1}, {-1, 1}, {-1, -1} };
pair<int, int> ConvertToInt(string str)
{
char tc = str[0];
char tr = str[1];
return pair<int, int>(tr - '1' + 1, tc - 'A' + 1);
}
string ConvertToString(pair<int, int> pos)
{
char tr = pos.first + '1' - 1;
char tc = pos.second + 'A' - 1;
string ret = "";
ret += tc;
ret += tr;
return ret;
}
pair<int, int> Swap(string pos, pair<int, int>& dir)
{
pair<int, int> tmpPos = ConvertToInt(pos);
return pair<int, int>(tmpPos.first + dir.first, tmpPos.second + dir.second);
}
bool Cango(string& pos, pair<int, int> dir)
{
pair<int, int> tmpPos = ConvertToInt(pos);
int tmpRow = tmpPos.first + dir.first;
int tmpCol = tmpPos.second + dir.second;
if (tmpRow < 1 || tmpRow > 8 || tmpCol < 1 || tmpCol > 8) return false;
return true;
}
pair<int, int> StringToPair(string& dir)
{
for (int i = 0; i < 8; ++i)
if (dir == dirConvert[i])
return dirPair[i];
return { 0, 0 };
}
int main()
{
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
cin >> king >> stone >> cnt;
while (cnt--)
{
string dir; cin >> dir;
pair<int, int> Dir = StringToPair(dir);
if (!Cango(king, Dir)) continue; // 킹이 못 움직이면 아무것도 안함
pair<int, int> nk = Swap(king, Dir); // 킹의 다음 위치
string nextKing = ConvertToString(nk);
if (nextKing == stone) // 킹이 돌을 치는 경우(겹침)
{
if (!Cango(stone, Dir)) continue; // 돌이 밀려서 나가면 둘 다 이동 X
pair<int, int> ns = Swap(stone, Dir);
stone = ConvertToString(ns); // 돌 먼저 이동
}
king = nextKing; // 킹 이동
}
cout << king << endl;
cout << stone << endl;
return 0;
}'알고리즘 > 백준' 카테고리의 다른 글
| [백준] 2667 단지번호붙이기 C++ (0) | 2026.01.24 |
|---|---|
| [백준] 14889 스타트와 링크 C++ (0) | 2026.01.23 |
| [백준] 1244 스위치 켜고 끄기 C++ (0) | 2026.01.22 |
| [백준] 2108 통계학 C++ (0) | 2026.01.22 |
| [백준] 3048 개미 C++ (0) | 2026.01.21 |
@CGNY :: 김놀자
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!