[C++] BOJ 1938 - ํต๋๋ฌด ์ฎ๊ธฐ๊ธฐProblem Solving/Baekjoon Online Judge (BOJ)2025. 4. 25. 18:13
Table of Contents

01. ๐ ๋ฌธ์ ํ์
N: NxNํฌ๊ธฐ์ ํ์ง $(4 \leq N \leq 50)$
(N๊ฐ์ ์ค์๋ ๊ฐ ์นธ์ ์ํ{0: ๋น ์นธ, 1: ๋๋ฌด, B: ํต๋๋ฌด, E: ๋ชฉ์ ์ง}๊ฐ ์ฃผ์ด์ง)
ํต๋๋ฌด(B)์ ๋ชฉ์ ์ง(E)๋ ํญ์ ์ฐ์์ ์ผ๋ก 3๊ฐ๊ฐ ๋์ (BBB๊ฐ 1๊ฐ, EEE๊ฐ 1๊ฐ)
ํต๋๋ฌด์ ๋ชฉ์ ์ง๋ ๋๊ฐ์ ์ผ๋ก ๋์ผ ์ ์์ผ๋ฉฐ, ํญ์ x์ถ์ด๋ y์ถ๊ณผ ํํํจ
ํต๋๋ฌด๋ ์, ํ, ์ข, ์ฐ, 90๋ ํ์ ๊ณผ ๊ฐ์ด 5๊ฐ์ง ํ๋์ ํ ์ ์์
(ํ๋ ๋ฐ๊ฒฝ์ ๋๋ฌด(1)๊ฐ ์กด์ฌํ ๊ฒฝ์ฐ, ์ด๋/ํ์ ํ ์ ์์)
- ํต๋๋ฌด๋ฅผ 5๊ฐ์ง ํ๋์ผ๋ก ๋ชฉ์ ์ง๊น์ง ์ด๋์ํค๋, ์ต์ ๋์ ํ์๋ฅผ ์ถ๋ ฅ
01-1. ์๊ณ ๋ฆฌ์ฆ ์ ํ & ์๊ฐ ๋ณต์ก๋
- ํต๋๋ฌด๋ฅผ ๋ชฉ์ ์ง๊น์ง ์ด๋์ํค๊ธฐ ์ํ ์ต์ ๋์์ ๋ฌป๋ ๋ฌธ์ ๋ก, BFS๋ฅผ ํ์ฉํ ์ ์๋ค.
(๋จ, ์ฐ์๋ B(ํต๋๋ฌด)๋ ํจ๊ป ์์ง์ด๋ฏ๋ก ์ด๋ฅผ ๊ณ ๋ คํ์ฌ ๊ตฌํ๋์ด์ผ ํจ) - ๊ฐ ์นธ์ ๋ํด ํ๋ 5ํ๋ฅผ ํ์ํ๊ฒ ๋๋ฏ๋ก, ์ต์
์ ๊ฒฝ์ฐ 50*50*5 ์ฝ12,500 ํ ์ฐ์ฐ์ ๊ฐ์ง๊ฒ ๋จ
์ด๋ฅผ ์๊ฐ ๋ณต์ก๋๋ก ๋ํ๋ด๋ฉด $O(N^2)$๋ก 2์ด ๋ด์ ์ถฉ๋ถํ ๊ฐ๋ฅ
02. ๐ ์ฝ๋ ์ค๊ณํ๊ธฐ
- ํ์ง์ ๋ํ ์ ๋ณด๋ฅผ ์ ๋ ฅ (N๊ณผ {0: ๋น ์นธ, 1: ๋๋ฌด, B: ํต๋๋ฌด, E: ๋ชฉ์ ์ง})
- B์ E์ ์ค์์ ์์น์ ์ํ(๊ฐ๋ก/์ธ๋ก)๋ฅผ ๊ฐ๊ฐ ์ ์ฅ
- ํต๋๋ฌด์ ์์น๋ฅผ B์ ์ค์์ ์ ๊ธฐ์ค์ผ๋ก ๊ฐ๋ก, ์ธ๋ก ์ํ๋ก ๊ฐ๊ฐ BFS ํ์
- ํต๋๋ฌด๊ฐ ์ธ๋ก์ผ ๊ฒฝ์ฐ, ๊ฐ B์ y ๊ฐ์ด ์๋ก ๊ฐ์ผ๋ฏ๋ก $x \pm 1$ ์ ๋ํด์ ์ ํจํ์ง ํ์ธํ์ฌ ์ด๋
- ํต๋๋ฌด๊ฐ ๊ฐ๋ก์ผ ๊ฒฝ์ฐ, ๊ฐ B์ x ๊ฐ์ด ์๋ก ๊ฐ์ผ๋ฏ๋ก $y \pm 1$ ์ ๋ํด์ ์ ํจํ์ง ํ์ธํ์ฌ ์ด๋
- ํต๋๋ฌด๋ฅผ ํ์ ํด์ผ ํ ๊ฒฝ์ฐ, ์ค์์ ์ ๊ธฐ์ค์ผ๋ก ์ฃผ๋ณ(8๋ฐฉํฅ)์ ํ์ํ์ฌ, ํ์ง๋ฅผ ๋๊ฐ์ง ์๊ณ ๋๋ฌด๊ฐ ์๋ ๊ฒฝ์ฐ์๋ง ํ์
- ์์ ๊ท์น์ ๋ฐ๋ผ ํต๋๋ฌด๋ฅผ ์ด๋์ํค๋ฉฐ, ์ด๋ 1ํ๋น ํ์ฌ ์์น์ ๋ฐฉํฅ์ ๋ฐ๋ผ ํ์๋ฅผ ๋์
- ํ์์ด ๋๋๊ณ , ๋ชฉ์ ์ง์ ์ค์์ ์์น์ ๋ฐฉํฅ(๊ฐ๋ก/์ธ๋ก)์ ๋์ ๋ ํ์๋ฅผ ์ถ๋ ฅ
03. ๐ ๏ธ ์๋๋ณ ์์
1ํ์ฐจ

- ์ง์ง ๋๋ฌด ๋ฉ์ฒญํ๊ฒ ํ๋ ธ๋ค.. ์ต๊ด์ ์ผ๋ก ์ฐธ์กฐ๋ณ์๋ฅผ ์ฌ์ฉํ๋๋ฐ, queue์์ ์ ๊ฑฐํ ์์๋ฅผ ์ฐธ์กฐ ์ค์ธ ๋ชจ์ต์ด๋ค..

2ํ์ฐจ

04. ๐๏ธ ์ ๋ต ์ฝ๋
#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> pos;
#define X first
#define Y second
int N;
string board[51];
int cost[51][51][2];
bool visited[51][51][2];
const int dx[4] = {1, -1, 0, 0};
const int dy[4] = {0, 0, -1, 1};
const int ax[8] = {-1, -1, -1, 0, 1, 1, 1, 0};
const int ay[8] = {-1, 0, 1, 1, 1, 0, -1, -1};
bool is_valid(int x, int y){
return (x >= 0 && x < N && y >= 0 && y < N && board[x][y] != '1');
}
bool check_around(int x, int y){
for(int i = 0; i < 8; i++)
if(!is_valid(x+ax[i], y+ay[i])) return false;
return true;
}
int solution(vector<pos> loc, vector<pos> goal){
queue<tuple<int, int, int>> q;
int init_dir;
if(loc[0].X == loc[2].X) init_dir = 1;
else if(loc[0].Y == loc[2].Y) init_dir = 0;
int goal_dir;
if(goal[0].X == goal[2].X) goal_dir = 1;
else if(goal[0].Y == goal[2].Y) goal_dir = 0;
q.emplace(loc[1].X, loc[1].Y, init_dir);
visited[loc[1].X][loc[1].Y][init_dir] = true;
cost[loc[1].X][loc[1].Y][init_dir] = 0;
while(!q.empty()){
auto [x, y, dir] = q.front(); q.pop();
if(goal[1].X == x && goal[1].Y == y && dir == goal_dir)
return cost[goal[1].X][goal[1].Y][goal_dir];
for(int i = 0; i < 4; i++){
int nx = x + dx[i], ny = y + dy[i];
if(dir == 0){
if(!(is_valid(nx, ny) && is_valid(nx-1, ny) && is_valid(nx+1, ny))) continue;
if(visited[nx][ny][dir]) continue;
visited[nx][ny][dir] = true;
cost[nx][ny][dir] = cost[x][y][dir] + 1;
q.emplace(nx, ny, dir);
}
else{
if(!(is_valid(nx, ny) && is_valid(nx, ny-1) && is_valid(nx, ny+1))) continue;
if(visited[nx][ny][dir]) continue;
visited[nx][ny][dir] = true;
cost[nx][ny][dir] = cost[x][y][dir] + 1;
q.emplace(nx, ny, dir);
}
}
// Rotate
int nxt_dir = (dir + 1) % 2;
if(check_around(x, y) && !visited[x][y][nxt_dir]){
visited[x][y][nxt_dir] = true;
cost[x][y][nxt_dir] = cost[x][y][dir] + 1;
q.emplace(x, y, nxt_dir);
}
}
return 0;
}
int main(){
cin.tie(0)->sync_with_stdio(0);
cin >> N;
vector<pos> loc;
vector<pos> goal;
for(int i = 0; i < N; i++){
cin >> board[i];
for(int j = 0;j < N; j++){
if(board[i][j] == 'B') loc.emplace_back(i, j);
else if(board[i][j] == 'E') goal.emplace_back(i, j);
}
}
cout << solution(loc, goal) << "\n";
return 0;
}'Problem Solving > Baekjoon Online Judge (BOJ)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Java] BOJ 2842 - ์ง๋ฐฐ์ ํ์๋ (0) | 2025.04.27 |
|---|---|
| [Java] BOJ 12014 - ์ฃผ์ (0) | 2025.04.26 |
| [C++] BOJ 2515 - ์ ์์ฅ (0) | 2025.04.24 |
| [C++] BOJ 15685 - ๋๋๊ณค ์ปค๋ธ (0) | 2025.04.23 |
| [C++] BOJ 9328 - ์ด์ (1) | 2025.04.22 |
@ONE_ :: ์ ํธ์
์๋ชป๋ ์ ๋ณด๊ฐ ์๋ค๋ฉด ๋ง์ํด์ฃผ์ธ์!