๋ฌธ์
https://www.acmicpc.net/problem/5427
๋ด ๋ฌธ์ ํ์ด
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.StringTokenizer;
public class Main {
static Deque<int[]> que; // {์๊ทผ or ๋ถ ์ฌ๋ถ, sec, x์ขํ, y์ขํ} (์๊ทผ: 0, ๋ถ: 1)
static int[] dx = {0, 0, -1, 1};
static int[] dy = {-1, 1, 0, 0};
static int h, w;
static char[][] map;
public static int bfs() {
while(!que.isEmpty()) {
int[] now = que.removeFirst();
int type = now[0];
int sec = now[1];
int x = now[2];
int y = now[3];
findLoop:
for(int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if(type == 0) { // ์๊ทผ์ด
if(nx < 0 || ny < 0 || nx >= h || ny >= w) return sec+1; // ํ์ถ ์ฑ๊ณต
if(map[nx][ny] != '.') continue findLoop; // ๋น ๊ณณ ์๋ ๋
que.add(new int[]{type, sec+1, nx, ny});
map[nx][ny] = '@';
}
else { // ๋ถ
if(nx < 0 || ny < 0 || nx >= h || ny >= w || map[nx][ny] != '.') continue findLoop;
que.add(new int[]{type, sec+1, nx, ny});
map[nx][ny] = '*';
}
}
}
return -1;
}
public static void main(String[] args) throws Exception {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
StringBuffer out = new StringBuffer();
int tc = Integer.parseInt(in.readLine());
for(int t = 0; t < tc; t++) {
st = new StringTokenizer(in.readLine());
w = Integer.parseInt(st.nextToken());
h = Integer.parseInt(st.nextToken());
int[] startPoint = new int[3]; // ์๊ทผ์ด ์ ๋ณด ์ ์ ์ ์ฅํ ์ฉ๋
map = new char[h][w];
que = new ArrayDeque<>();
for(int i = 0; i < h; i++) {
String tmp = in.readLine();
for(int j = 0; j < w; j++) {
map[i][j] = tmp.charAt(j);
if(tmp.charAt(j) == '*') que.add(new int[]{1, 0, i, j});
else if(tmp.charAt(j) == '@') startPoint = new int[]{0, 0, i, j};
}
}
que.add(startPoint); // ์๊ทผ์ด๋ฅผ ๋งจ ๋ค์ ์ถ๊ฐํ๊ธฐ ์ํจ
int result = bfs();
if(result == -1) System.out.println("IMPOSSIBLE");
else System.out.println(result);
}
}
}
๐ BFS ๋ฌธ์
[ ๋ฌธ์ ํ๊ธฐ ์ ์ฒดํฌ ! ]
โ๏ธ ์๊ทผ์ด๋ ๋จ ํ ๋ช ์ด๊ณ , ๋ถ์ฒ๋ผ ํผ์ง๋ ์กด์ฌ๊ฐ ์๋์ง๋ง, ๋ถ์ฒ๋ผ ํผ๋จ๋ ค์ฃผ๋ ๋ฐฉ๋ฒ์ ํํ๋ค.
๊ทธ ์ด์ ๋! ์๊ทผ์ด๊ฐ ์ง๋๊ฐ๋ ์๋ฆฌ๋ ์ถํ์ ์ถํ์ ์ค๋๋ผ๋ ์๋ฌด๋ฐ ์๋ฏธ๊ฐ ์์ผ๋ฉฐ,
์๊ทผ์ด๊ฐ ๊ฐ๋ ์๋ฆฌ๋ง๋ค @๋ฅผ ํ์ํด์ฃผ์ด ์์ทจ๋ฅผ ๋จ๊ธฐ๋ฉด ์ด๋ ๋ฐฉ๋ฌธ ์ฒดํฌ์ฒ๋ผ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์,
๋ถ์ ์๋ฏธ์๋ ํผ์ง์ ๋ฐฉ์งํ์ฌ ํจ์จ์ ๋์ผ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
=> visited ๋ฐฐ์ด ํ์ x
โ๏ธ ๋ถ์ด ์์ผ๋ก ํผ์ ธ ๋๊ฐ ์์ ์ธ ์๋ฆฌ์๋ ์๊ทผ์ด๋ ๊ฐ ์ ์์ผ๋ฏ๋ก,
๋ถ์ ๋จผ์ ํผ๋จ๋ฆฐ ํ ์๊ทผ์ด๋ฅผ ์์ง์ด๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค.
[ ๋ฌธ์ ํ์ด ]
- bfs ํ์์ ์ํ์ฌ que๋ผ๋ ๋ฑ์ ๋ง๋ค์ด์ฃผ์๊ณ , intํ ๋ฐฐ์ด์ ์์๋ก ๊ฐ์ง๋๋ก ํ๋ค.
์ ์ฅ๋๋ intํ ๋ฐฐ์ด์ {type, sec, x, y} ํํ๋ก ๋ง๋ค์ด์ฃผ์๋๋ฐ, ์๋์๊ฐ์ด ์ ๋ฆฌํ ์ ์๋ค.
- type : ์๊ทผ์ด๋ 0, ๋ถ์ 1
- sec : ํด๋น ์๋ฆฌ๊น์ง ํผ์ง๋๋ฐ ๊ฑธ๋ฆฐ ์๊ฐ
- x, y : ์ขํ - ์ฒ์ ์ง๋์ ๋ํ ์ ๋ณด๋ฅผ ๋ฐ์ ๋, ๋ฐ๋ก ๋ถ๊ณผ ์๊ทผ์ด์ ์์น๋ฅผ ํ์
ํ๊ณ que์ ๋ฃ์ด์ฃผ์๋๋ฐ,
์๊ทผ์ด์ ๊ฒฝ์ฐ ๋ถ๋ณด๋ค ๋์ค์ ์์ง์ด๋๋ก ํ๊ธฐ ์ํด
์ฐ์ startPoint ๋ฐฐ์ด์ ์์ ์ ์ฅ, ๋ชจ๋ ์ ๋ ฅ์ด ์ข ๋ฃ๋์์ ๋ ๋ง์ง๋ง์ผ๋ก que์ addํ๋ค. - bfs ํ์ ์ ํ์ฌ ํ์ํ๋ que ์์๊ฐ ์๊ทผ์ด์ผ ๊ฒฝ์ฐ์ ๋ถ์ผ ๊ฒฝ์ฐ๋ก ๋๋์ด์ฃผ์๋ค.
- ์๊ทผ์ด์ ๊ฒฝ์ฐ map ๋ฐฐ์ด์ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ฉด ํ์ถ์ ์ฑ๊ณตํ ๊ฒ์ผ๋ก ๊ฐ์ฃผ, sec+1์ returnํ๋ค.
๋น ๊ณณ์ ๋ง๋์ง ๋ชปํ์ ๋๋ ์์ธ๋ก ์ฒ๋ฆฌํด์ฃผ์๊ณ ,
๋น ๊ณณ์ ๋ง๋ฌ์ ๋๋ ์๋ก์ด ํ์ ์์น๋ฅผ que์ ์ถ๊ฐํ๊ณ , ์๊ทผ์ด์ ์์ง์์ map์ ํ์ํ๋ค. - ๋ถ์ ๊ฒฝ์ฐ map ๋ฐฐ์ด์ ๋ฒ์๋ฅผ ๋ฒ์ด๋๊ฑฐ๋ ๋น ๊ณณ์ ๋ง๋์ง ๋ชปํ์์ ๋ ์์ธ๋ก ์ฒ๋ฆฌํ๊ณ ,
๋น ๊ณณ์ ๋ง๋ฌ์ ๋๋ que์ ์๋ก์ด ํ์ ์์น๋ฅผ ์ถ๊ฐํ๊ณ , ๋ถ์ ์์ง์์ map์ ํ์ํ๋ค. - while๋ฌธ์ด ์ข
๋ฃ๋ ๋๊น์ง returnํ์ง ์์๋ค๋ฉด ์๊ทผ์ด๋ ํ์ถ์ ์คํจํ๋ค๋ ๋ป์ด๋ฏ๋ก
-1์ ๋ฆฌํดํ๋๋ก ํ๊ณ , ์ด ๋๋ IMPOSSIBLE์ ์ถ๋ ฅํ๋ค.
๐ก ํผ๋๋ฐฑ
- BFS์ ๋์์ ์ ์ดํดํ๊ณ ์๋ค๋ฉด ๊ธ๋ฐฉ ํ ์ ์๋ ๋ฌธ์ ๊ฐ๋ค.
'2๏ธโฃ Java > Problem Solving' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java Algorithm] ํธ๋ฆฌ BOJ #4803 (0) | 2022.08.09 |
---|---|
[Java Algorithm] ์จ๋ฐ๊ผญ์ง 4 BOJ #13913 (0) | 2022.08.08 |
[Java Algorithm] ์จ๋ฐ๊ผญ์ง 3 BOJ #13549 (0) | 2022.08.08 |
[Java Algorithm] ๋ฒฝ ๋ถ์๊ณ ์ด๋ํ๊ธฐ BOJ #2206 (0) | 2022.08.08 |
[Java Algorithm] ์ ๊ธฐํ ์์ BOJ #2023 (0) | 2022.08.05 |
๋๊ธ