[C++] BOJ 9328 - ์ด์ Problem Solving/Baekjoon Online Judge (BOJ)2025. 4. 22. 16:06
Table of Contents

01. ๐ ๋ฌธ์ ํ์
T: ํ
์คํธ์ผ์ด์ค ๊ฐ์ $(T \leq 100)$
h, w: ๋์ด์ ๋๋น $(2 \leq h,w \leq 100)$
- ๊ฐ ์นธ์ ์ํ
{
'.': ๋น ๊ณต๊ฐ,
'*': ๋ฒฝ,
'$': ๋ฌธ์,
(๋๋ฌธ์): ๋ฌธ,
(์๋ฌธ์): ์ด์
} - ๋ฌธ(๋๋ฌธ์)์ ๊ทธ ์ํ๋ฒณ์ด ๋ํ๋ด๋ ์ด์ (์๋ฌธ์)๋ก ์ด ์ ์์
- ์ด์ ๋ ์ฌ๋ฌ ๋ฒ ์ฌ์ฉ ๊ฐ๋ฅ
- ์๊ทผ์ด๋ ๋น๋ฉ ๋ฐ์์ ์์ํด, ๊ฐ์ฅ์๋ฆฌ์ ๋ฒฝ์ด ์๋ ๋ถ๋ถ ์ด๋๋ก๋ ๋น๋ฉ์ผ๋ก ๋ค๋๋ค ์ ์์
- ๋ง์ฝ, ๋ฌธ์ด ์์ ๊ฒฝ์ฐ ๊ทธ ๋ฌธ์ ์ด์ ๊ฐ ํ์
- OUTPUT
- ์๊ทผ์ด๊ฐ ํ์น ์ ์๋ ๋ฌธ์์ ์ต๋ ๊ฐ์๋ฅผ ์ถ๋ ฅ
01-1. ๊ฐ๋ฅํ ์๊ฐ ๋ณต์ก๋
- ๋น๋ฉ์ ๋ค์ด๊ฐ ์ ์๋ ๊ฐ์ฅ์๋ฆฌ ํ์ ์ต๋ 4*100 - 4 = ์ฝ 396ํ, ์๊ฐ ๋ณต์ก๋ $O(2h + 2w - 4)$
- ๋น๋ฉ์ ๋ค์ด๊ฐ ๋ค, ๋น๋ฉ ๋ด๋ถ ํ์ ์ต๋ 100^2 = ์ฝ 10,000ํ, ์๊ฐ ๋ณต์ก๋ $O(h * w)$
- ๋ง์ฝ, ์ด์ ๋ฅผ ์ฃผ์ ์ ๊ฒฝ์ฐ ๋ฌธ์ ์ด์ด ์๋ก์ด ์์ญ์ ํ์ํ ์๋ ์์ผ๋ฏ๋ก ์ด์ ๋ฅผ ์ฃผ์ ์ ๊ฒฝ์ฐ, ์ฌํ์
์ต์ ์ ๊ฒฝ์ฐ, 1๋ฒ์ ํ์์์ 1๊ฐ ์ด์ ๋ฅผ ์ฃผ์ธ ๋๋ง๋ค ์๋ก์ด ํ์์ด ๋ฐ์ํ์ฌ 27๋ฒ ํ์์ด ์ด๋ฃจ์ด์ง ์ ์์
์ด๋ 27 * (๊ฐ์ฅ์๋ฆฌ ํ์) * (๋น๋ฉ ๋ด๋ถ ํ์) = ์ฝ 106,920,000 ํ๋ก 1์ด๋ด์ ํด๊ฒฐ ๊ฐ๋ฅ
01-2. ์๊ณ ๋ฆฌ์ฆ ์ ํ
- BFS๋ฅผ ์ด์ฉํ ์๋ฎฌ๋ ์ด์
๋ฌธ์
(๋จ, ์ด์ ๋ฅผ ์ฃผ์ ์ ๊ฒฝ์ฐ, ์ฌํ์์ด ์คํ๋์ด์ผ ํจ)
02. ๐ ์ฝ๋ ์ค๊ณํ๊ธฐ
- ์๊ทผ์ด๊ฐ ๊ฐ์ง๊ณ ์๋ ํ๋ฉด๋์ ์ด์ ์ ๋ณด๋ฅผ ์ ๋ ฅ
- ๋น๋ฉ ๋ด๋ถ๋ก ์ง์
ํ ์ ์๋ ๊ฐ์ฅ์๋ฆฌ ํ์ ['.', '$', (๋๋ฌธ์), (์๋ฌธ์)]ํ์ฌ,
์ง์ ํ ์ ์๋ค๋ฉด ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ ํ queue์ ์ถ๊ฐ
- ๋ง์ฝ, ๊ฐ์ฅ์๋ฆฌ์ ๋ฌธ์ด ์์ ๊ฒฝ์ฐ ๊ทธ ๋ฌธ์ ๋ง๋ ์ด์ ๋ฅผ ์ง๋๊ณ ์๋ ์ง ํ์ธ
- ์ด์ ๊ฐ ์๋ค๋ฉด ์ง์ ํ ์ ์์ผ๋ฏ๋ก, ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ ํ queue์ ์ถ๊ฐ
- ๋น๋ฉ ๋ด๋ถ๋ก ์ง์
ํ์ฌ ํ์ฌ ์์น์ ์ด์ ๋, ๋ฌธ์๊ฐ ์์ ๊ฒฝ์ฐ ์ค๊ณ ํ์ฌ ์์น๋ฅผ ๋น ์นธ('.')์ผ๋ก ์ ์ฅ
- ์ด์ ๋ฅผ ์ฃผ์ ์ ๊ฒฝ์ฐ ์ด์ ๋ฅผ ์ฃผ์ ๋ค๋ ์ํ๋ฅผ ์ ์ฅ (got_new_key = true)
- ๋ฌธ์๋ฅผ ์ฃผ์ ์ ๊ฒฝ์ฐ ๋ฌธ์ ๊ฐ์ + 1
- BFS๋ฅผ ํตํด ๋น๋ฉ ๋ด๋ถ๋ฅผ ํ์
- ์ด์ ๋ฅผ ์ฃผ์ ์ ๊ฒฝ์ฐ ์ด์ ๋ฅผ ์ฃผ์ ๋ค๋ ์ํ๋ฅผ ์ ์ฅ (got_new_key = true)
- ๋ฌธ์๋ฅผ ์ฃผ์ ์ ๊ฒฝ์ฐ ๋ฌธ์ ๊ฐ์ + 1
- ๋ฌธ์ด ์์ ๊ฒฝ์ฐ, ๊ทธ ๋ฌธ์ ๋ง๋ ์ด์ ๋ฅผ ์ง๋๊ณ ์๋ค๋ฉด ์ง์
- ๋ง์ฝ, ์ด์ ๋ฅผ ์๋ก ์ฃผ์ ๋ค๋ฉด 2๋ฒ๋ถํฐ ๋ค์ ์์ํ๊ณ , ์๋๋ผ๋ฉด ๋์ ๋ ๋ฌธ์ ๊ฐ์๋ฅผ ๋ฐํํ์ฌ ์ถ๋ ฅ
03. ๐ ๏ธ ์๋๋ณ ์์
1ํ์ฐจ
- ์ต์ด ์ง์ ํ ๋ฐ๋ฅ์ ์ด์ ๋ ๋ฌธ์๊ฐ ์์ ๊ฒฝ์ฐ, ์ด๋ฅผ ์ค๋ ์ฒ๋ฆฌ๋ฅผ ํ์ง ์์์ ์์ ํจ
2ํ์ฐจ
04. ๐๏ธ ์ ๋ต ์ฝ๋
#include <bits/stdc++.h>
using namespace std;
template <typename T>
using matrix = vector<vector<T>>;
int h, w;
vector<string> board;
vector<bool> has_key;
bool got_new_key;
const int dx[4] = {-1, 1, 0, 0};
const int dy[4] = {0, 0, -1, 1};
bool is_valid(int x, int y){
return (x >= 0 && x < h && y >= 0 && y < w);
}
bool is_key(char mark){
return ('a' <= mark && mark <= 'z');
}
bool is_door(char mark){
return ('A' <= mark && mark <= 'Z');
}
bool open_door(char mark){
return (is_door(mark) && has_key[tolower(mark) - 'a']);
}
bool is_entrypoint(char mark){
return (mark == '.' || mark == '$' || is_key(mark) || open_door(mark));
}
int search(){
matrix<bool> visited(h, vector<bool>(w, false));
queue<pair<int, int>> q;
int doc_cnt = 0;
for(int i = 0; i < h; i++){
if(is_entrypoint(board[i][0]) && !visited[i][0]) {
q.emplace(i, 0);
visited[i][0] = true;
}
if(is_entrypoint(board[i][w-1]) && !visited[i][w-1]) {
q.emplace(i, w-1);
visited[i][w-1] = true;
}
}
for(int j = 0; j < w; j++){
if(is_entrypoint(board[0][j]) && !visited[0][j]) {
q.emplace(0, j);
visited[0][j] = true;
}
if(is_entrypoint(board[h-1][j]) && !visited[h-1][j]) {
q.emplace(h-1, j);
visited[h-1][j] = true;
}
}
while(!q.empty()){
auto& [x, y] = q.front(); q.pop();
char &mark = board[x][y];
if(is_key(mark)) {
int key_idx = mark - 'a';
if(!has_key[key_idx]){
has_key[key_idx] = true;
got_new_key = true;
}
mark = '.';
}
else if(mark == '$') {
doc_cnt++;
mark = '.';
}
for(int i = 0; i < 4; i++){
int nx = x + dx[i], ny = y + dy[i];
if(!is_valid(nx, ny) || board[nx][ny] == '*' || visited[nx][ny]) continue;
else if(is_door(board[nx][ny]) && !open_door(board[nx][ny])) continue;
q.emplace(nx, ny);
visited[nx][ny] = true;
}
}
return doc_cnt;
}
int solution(){
int doc_cnt = 0;
got_new_key = true;
while(got_new_key){
got_new_key = false;
doc_cnt += search();
}
return doc_cnt;
}
int main(){
cin.tie(0)->sync_with_stdio(0);
int T;
cin >> T;
while(T--){
string keys;
cin >> h >> w;
board.assign(h, "");
has_key.assign(27, false);
for(int i = 0; i < h; i++) cin >> board[i];
cin >> keys;
if(keys != "0")
for(auto& key : keys) has_key[key - 'a'] = true;
cout << solution() << "\n";
}
return 0;
}
'Problem Solving > Baekjoon Online Judge (BOJ)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [C++] BOJ 2515 - ์ ์์ฅ (0) | 2025.04.24 |
|---|---|
| [C++] BOJ 15685 - ๋๋๊ณค ์ปค๋ธ (0) | 2025.04.23 |
| [C++] BOJ 19238 - ์คํํธ ํ์ (0) | 2025.04.21 |
| [C++] BOJ 12850 - ๋ณธ๋ ์ฐ์ฑ 2 (0) | 2025.04.20 |
| [C++] BOJ 11444 - ํผ๋ณด๋์น ์ 6 (0) | 2025.04.20 |
@ONE_ :: ์ ํธ์
์๋ชป๋ ์ ๋ณด๊ฐ ์๋ค๋ฉด ๋ง์ํด์ฃผ์ธ์!