ํฐ์คํ ๋ฆฌ ๋ทฐ
...XXXXXX..XX.XXX ....XXXX.......XX .....XX..........
....XXXXXXXXX.XXX .....XXXX..X..... ......X..........
...XXXXXXXXXXXX.. ....XXX..XXXX.... .....X.....X.....
..XXXXX..XXXXXX.. ...XXX....XXXX... ....X......XX....
.XXXXXX..XXXXXX.. ..XXXX....XXXX... ...XX......XX....
XXXXXXX...XXXX... ..XXXX.....XX.... ....X............
..XXXXX...XXX.... ....XX.....X..... .................
....XXXXX.XXX.... .....XX....X..... .................
์ฒ์ ์ฒซ์งธ ๋ ๋์งธ ๋
์ด๊ฑด BFS ๋ฌธ์ ์ด๋ค
BFS (Breath-First search)
- L๊ณผ L ์ฌ์ด์ ๊ฒฝ๋ก๊ฐ ์กด์ฌํ๋์ง ํ๋ณํ๊ณ , ๊ฒฝ๋ก๊ฐ ์๋ค๋ฉด ํ๋ฃจ๊ฐ ์ง๋ ์ผ์์ด ๋ น์ ์ํ์์ ๋ค์ ํ์
- ๋ฐ๋ณต๋ฌธ์ ํตํด ๊ธธ์ ์ฐพ์๋๊น์ง ๋ฐ๋ณตํ๋ค๋ฉด ์๊ฐ์ด๊ณผ
BFS๋?
1. L(์์๋ ธ๋) ๋ฐฉ๋ฌธ
- ๋ฐฉ๋ฌธํ ๋ ธ๋ ํ์ ์ฝ์
2. ํ์์ ๊บผ๋ธ ๋ ธ๋์ ์ธ์ ํ ๋ ธ๋๋ฅผ ์ฐจ๋ก๋ก ๋ฐฉ๋ฌธ
- ํ์์ ๊บผ๋ธ ๋ ธ๋ ๋ฐฉ๋ฌธ(์ธ์ ํ ๋ ธ๋๊ฐ ์๋ค๋ฉด ํ์ front์์ ๋ ธ๋ ๊บผ๋)
- ํ์ ๋ฐฉ๋ฌธํ ๋ ธ๋ ์ฝ์
3. ํ๊ฐ ์์ง๋ ๋๊น์ง ๊ณ์
์ด๊ฑธ ์ด ๋ฌธ์ ์ ์ ์ฉํ๋ค๋ฉด
1. ๋จผ์ ๋ ์ค ํ๋์ L ์ฃผ๋ณ์ ์๋ ๋ฌผ์ BFS๋ก ํ์
2. ๋ค๋ฅธ L์ ์ฐพ์ ์ ์์๋ค๋ฉด ๋ฌผ ์์ ์ผ์์ nextQ์ ์ฝ์
3. ์ผ์์ ๋ น์(ํ๋ฃจ ์ง๋จ)
4. ๊ทธ๋ ๋ค๋ฉด nextQ์๋ L์ด ๋๋ฌ๋ณผ ๋ฌผ์ด ๋จ์(์ด์ ์ ํ์ํ ๋ฌผ์ ์ฌํ์ํ ํ์ X)
- waterQ๋ฅผ ์์ฑํด ๋ฌผ์ ์ ์ฅํด๋๊ณ , ์ผ์์ ๋ น์ด๋ ๋ฐฉ์๋ ์์
[์ฝ๋]
// BOJ 3197๋ฒ : ๋ฐฑ์กฐ์ ํธ์
#include <iostream>
#include <queue>
using namespace std;
struct Queue{ // ์ขํ 2๊ฐ๋ก ์ด๋ฃจ์ด์ง ํ
int x;
int y;
};
char lake[1501][1501]; // ํธ์
char visit[1501][1501]; // ๋ฐฉ๋ฌธ ํ์ ๋ฐฐ์ด
int dx[4] = {0, 1, 0, -1};
int dy[4] = {1, 0, -1, 0};
int main() {
int r, c; // ํธ์์ ํ, ์ด
int lr, lc; // L์ ์์น
string s; // ํธ์ ๋ฐ๊ธฐ
int day = 0; // ๊ฑธ๋ฆฌ๋ ๋
queue<Queue> waterQ; // ๋ฌผ์ธ ๊ณณ์ ๋ฃ๋ ํ
cin >> r >> c; // ๋จผ์ ํ๊ณผ ์ด์ ์
๋ ฅ๋ฐ์
for(int i = 0; i < r; i++){
cin >> s; // ๋ฌธ์์ด ์
๋ ฅ๋ฐ์(์ค ๋จ์)
for(int j = 0; j < c; j++){
lake[i][j] = s[j]; // ์
๋ ฅ๋ฐ์ ๋ฌธ์๋ฅผ ํธ์ ๋ฐฐ์ด์ ๋์
if(lake[i][j] == 'L'){ // ๋ง์ฝ L์ด๋ผ๋ฉด
lr = i; // L์ ์์น๋ฅผ ์ ์ฅ
lc = j;
}
if(lake[i][j] == '.' || lake[i][j] == 'L'){
waterQ.push({i, j}); // ๋ฌผ์ด๋ผ๋ฉด waterQ์ push
}
}
}
queue<Queue> Q;
Q.push({lr, lc}); // L์ ์์น๋ฅผ push
visit[lr][lc] = true; // L์ ์์น ๋ฐฉ๋ฌธํ๋ค๊ณ ์ฒดํฌ
while(1){
queue<Queue> nextQ;
bool success = false;
while(!Q.empty() && !success){ // ํ๊ฐ ๋น์ด์์ง ์๊ณ , ์ฑ๊ณตํ์ง ์์๊ฒฝ์ฐ ๋ฐ๋ณต
auto temp = Q.front();
Q.pop();
for(int i = 0; i < 4; i++){ // ํ์ฌ ์์น์์ ์ฃผ์ ํ์ํ๋ ๊ฒ(์ํ์ข์ฐ)
int nx = temp.x + dx[i]; // ๋ค์ ํ์ํ x
int ny = temp.y + dy[i]; // ๋ค์ ํ์ํ y
if(nx < 0 || nx > r - 1 || ny < 0 || ny > c - 1) // ๋ฒ์ ๋ฒ์ด๋ ๊ฒฝ์ฐ
continue;
if(lake[nx][ny] == 'L' && visit[nx][ny] == false){ // L์ธ๋ฐ ๋ฐฉ๋ฌธ X
success = true; // ํ์ ์ฑ๊ณต
break; // ๋ฐ๋ณต๋ฌธ ์ข
๋ฃ
}
if(lake[nx][ny] == '.' && visit[nx][ny] == false){ // ๋ฌผ์ธ๋ฐ ๋ฐฉ๋ฌธ X
Q.push({nx, ny}); // ํ์ ์์น ๋ฃ์
visit[nx][ny] = true; // ๋ฐฉ๋ฌธํ๋ค๊ณ ํ์
}
if(lake[nx][ny] == 'X' && visit[nx][ny] == false){ // ์ผ์์ธ๋ฐ ๋ฐฉ๋ฌธ X
nextQ.push({nx, ny}); // ๋ค์์ ๋ฐฉ๋ฌธํ๊ธฐ ์ํด nextQ์ push
visit[nx][ny] = true; // ๋ฐฉ๋ฌธํ๋ค๊ณ ํ์
}
}
}
if(success){ // ํ์ ์ฑ๊ณต์
cout << day << "\n"; // ๊ฑธ๋ฆฐ ๋ ์ง ์ถ๋ ฅ
break; // while๋ฌธ ์ข
๋ฃ
}
Q = nextQ; // ํ์ ๋ฐฉ๋ฌธํด์ผ ํ nextQ๋ฅผ ๋ฃ์
int watersize = waterQ.size(); // waterQ์ ์์ ๊ฐ์
while(watersize){ // ํ๋ฃจ๊ฐ ์ง๋ ์ผ์์ด ๋
น์ ์ํฉ์ผ๋ก ๋ฐ๊ฟ์ค
auto temp = waterQ.front(); // waterQ์ ๋งจ ์ ์์ ๋ด์
waterQ.pop(); // ๋ด์ ์์ ์ ๊ฑฐ
for(int i = 0; i < 4; i++){ // ์ํ์ข์ฐ ํ์ ์์
int nx = temp.x + dx[i];
int ny = temp.y + dy[i];
if(nx < 0 || nx > r - 1 || ny < 0 || ny > c - 1) // ๋ฒ์ ๋ฒ์ด๋ ๊ฒฝ์ฐ
continue;
if(lake[nx][ny] == 'X'){ // ์ผ์ด์๋ ๊ฒฝ์ฐ
waterQ.push({nx, ny}); // ์์น ์ ์ฅํ๊ณ (push)
lake[nx][ny] = '.'; // ๋ฌผ๋ก ๋ฐ๊ฟ
}
}
watersize--;
}
day++; // ํ๋ฃจ ์ฆ๊ฐ
}
}
์ฌ๊ธฐ์ auto๋? → ํ์ ์ถ๋ก
- auto ํค์๋๋ ์ ์ธ๋ ๋ณ์์ ์ด๊ธฐํ ์์ ์ฌ์ฉํด ํด๋น ํ์์ ์ถ๋ก ํ๋๋ก ์ปดํ์ผ๋ฌ์ ์ง์
- ์ฆ ์ด๊น๊ฐ์ ํ์์ ๋ง์ถฐ ์ ์ธํ๋ ์ธ์คํด์ค(๋ณ์)์ ํ์์ด '์๋'์ผ๋ก ๊ฒฐ์ → ํ์ ์ถ๋ก (type inference)
'๐ STUDY > ๐ baekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[baekjoon] ๋ฐฑ์ค 1712๋ฒ : ์์ต๋ถ๊ธฐ์ (C) (0) | 2022.07.29 |
---|---|
[baekjoon] 9086๋ฒ : ๋ฌธ์์ด (C++) (0) | 2022.07.29 |
[baekjoon] 17608๋ฒ : ๋ง๋๊ธฐ (C++) (2) | 2021.09.07 |
[baekjoon] 12605๋ฒ : ๋จ์ด์์ ๋ค์ง๊ธฐ (C++) (0) | 2021.09.07 |
[baekjoon] 1158๋ฒ : ์์ธํธ์ค ๋ฌธ์ (C++) (0) | 2021.09.07 |
- ๋จธ์ ๋ฌ๋
- ์ค์น
- bitnami
- Programming
- ๊ธฐ๊ณํ์ต
- MySQL
- C
- ๋ค์คํ๋ก์ธ์ค
- Linux
- react-scripts
- 9086๋ฒ
- ๋ฆฌ๋ ์ค
- C++
- ๋ฐฑ์ค
- react
- error
- ํ๋ก๊ทธ๋๋ฐ
- GIT
- ์ค๋ฅ
- ํ์ผ ์ ์ถ๋ ฅ
- ํ๋ก์ธ์ค
- ์๊ณ ๋ฆฌ์ฆ
- PHP
- Annotation
- SWiFT
- SpringBoot
- Baekjoon
- machine learning
- Apache
- ๋ฒํผ
- Total
- Today
- Yesterday