๋ฌธ์ (์ถ์ฒ: https://www.acmicpc.net/problem/4179)
<๋ถ!>
๋ฌธ์ ํ์ด
bfs๋ฅผ ํ์ฉํ์ฌ ๋ถ์ ๋จผ์ ์ด๋์ํจ ํ ์ฌ๋์ ์ด๋์ํจ๋ค.
- my solution (Java)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class _4179_ { // ๋ถ!
static boolean flag ;
static char map[][];
static Queue<int[]> queue, position;
static int dx[] = { -1, 1, 0, 0 }; // ์ํ์ข์ฐ
static int dy[] = { 0, 0, -1, 1 };
static int r, c, result;
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(bf.readLine());
r = Integer.parseInt(st.nextToken());
c = Integer.parseInt(st.nextToken());
map = new char[r][c];
queue = new LinkedList<>();
position = new LinkedList<>();
flag = false;
for (int i = 0; i < r; i++) { // input
String s = bf.readLine();
for (int j = 0; j < c; j++) {
map[i][j] = s.charAt(j);
if (map[i][j] == 'J') {
position.add(new int[] { i, j, 0 });
} else if (map[i][j] == 'F') {
queue.add(new int[] { i, j, 0 });
}
}
}
result = 0;
while (true) {
if (position.size() == 0)
break;
result += 1;
search();
if (flag)
break;
}
if (flag)
System.out.println(result);
else
System.out.println("IMPOSSIBLE");
}
private static void search() {
while (!queue.isEmpty()) { // fire move
if(queue.peek()[2]==result-1) {
int[] temp = queue.poll();
for (int i = 0; i < 4; i++) {
int x = temp[0] + dx[i];
int y = temp[1] + dy[i];
if (x >= 0 && x < r && y >= 0 && y < c) {
if (map[x][y] == '.' || map[x][y] == 'J') {
map[x][y] = 'F';
queue.add(new int[] { x, y, temp[2] + 1 });
}
}
}
}else break;
}
while (!position.isEmpty() ) { // ์งํ move
if(position.peek()[2]==result-1) {
int[] temp = position.poll();
for (int i = 0; i < 4; i++) {
int x = temp[0] + dx[i];
int y = temp[1] + dy[i];
if (x >= 0 && x < r && y >= 0 && y < c && map[x][y] == '.') {
position.add(new int[] { x, y, temp[2] + 1 });
map[x][y]='J';
} else if (x < 0 || x >= r || y < 0 || y >= c) { // ๋ฏธ๋ก ํ์ถ
flag = true;
position.clear();
break;
}
}
if(flag) break;
}else break;
}
}
}
- Main
- r, c ์ ๋ ฅ
- map : ๋ฏธ๋ก ์ ๋ ฅ
- queue, position : ๋ถ์ ์์น์ ์ฌ๋ ์์น๋ฅผ [x์ขํ, y์ขํ, ์ด๋ ํ์] ๋ฐฐ์ด๋ก ์ ์ฅ
- flag: ์ข ๋ฃ ์กฐ๊ฑด (์ฌ๋์ด ๋ฏธ๋ก๋ฅผ ํ์ถํ ๊ฒฝ์ฐ)
- ๋ฏธ๋ก๋ฅผ ์ ๋ ฅ ๋ฐ์๊ณผ ๋์์ ์ฌ๋ ์์น์ ๋ถ ์์น๋ฅผ ๊ฐ๊ฐ Queue์ ์ ์ฅ
- ๋ฌดํ ๋ฐ๋ณต : ์ข ๋ฃ ์กฐ๊ฑด ) ์ฌ๋์ด ๋ฏธ๋ก๋ฅผ ํ์ถํ๊ฑฐ๋ ๋ถ์ด ๋๋ฌํ์ฌ ๋ฏธ๋ก๋ฅผ ํ์ถํ ์ ์๋ ๊ฒฝ์ฐ
- ์ฌ๋์ด ๋ฏธ๋ก๋ฅผ ํ์ถํ ๊ฒฝ์ฐ flag๊ฐ true์ด๋ฏ๋ก result๋ฅผ ์ถ๋ ฅ but flag๊ฐ false์ด๋ฉด ๋ฏธ๋ก๋ฅผ ํ์ถํ ์ ์์ผ๋ฏ๋ก IMPOSSIBLE ์ถ๋ ฅ
- search
- ๋ถ ์ด๋
- 1์ด์ ํด๋นํ๋ ๋ถ๋ง ์ด๋์ํค๊ธฐ ์ํด queue์ ์ฒซ ๋ฒ์งธ ๊ฐ์ด result-1 ๊ฐ๊ณผ ๊ฐ๋ค๋ฉด ์ฒซ ๋ฒ์งธ ๊ฐ์ ๋ฝ์ ์ํ์ข์ฐ ์ด๋ -> ๋ฏธ๋ก ๋ฒ์ ์์ด๋ฉฐ ์ง๋๊ฐ ์ ์๋ ๊ณต๊ฐ ๋๋ ์ฌ๋์ ์์น๋ผ๋ฉด ๋ถ๋ก ํ์ ๋ฐ queue์ ์ถ๊ฐ (* ์ฌ๋์ ์์น๋ผ๋ ๋ถ๋ก ํ์ํ๋ ์ด์ ๋ ์ด๋ฏธ position์ด๋ผ๋ queue์ ์ฌ๋์ ์์น๋ฅผ ์ ์ฅํด๋์๊ธฐ ๋๋ฌธ์ ์๊ด์์)
- queue์ ์ฒซ ๋ฒ์งธ ๊ฐ์ด result-1๊ณผ ๊ฐ์ง ์๋ค๋ฉด 1์ด์ ํด๋นํ๋ ๋งํผ ๋ถ์ ๋ค ์ด๋์์ผฐ๋ค๋ ๋ป์ด๋ฏ๋ก break
- ์ฌ๋ ์ด๋
- 1์ด์ ํด๋นํ๋ ๋งํผ ์งํ์ด๋ฅผ ์ด๋์ํค๊ธฐ ์ํด queue์ ์ฒซ ๋ฒ์งธ ๊ฐ์ด result-1 ๊ฐ๊ณผ ๊ฐ๋ค๋ฉด ์ฒซ ๋ฒ์งธ ๊ฐ์ ๋ฝ์ ์ํ์ข์ฐ ์ด๋ -> ๋ฏธ๋ก ๋ฒ์ ์์ด๋ฉฐ ์ง๋๊ฐ ์ ์๋ ๊ณต๊ฐ์ด๋ผ๋ฉด queue์ ์ ์ฅ ๋ฐ map์ ํ์
- ์ํ์ข์ฐ ์ด๋์ ๋ฏธ๋ก ๋ฒ์ ๋ฐ์ด๋ผ๋ฉด ๋ฏธ๋ก ํ์ถ์ด๋ผ๋ ๋ป์ด๋ฏ๋ก flag๋ฅผ true๋ก ๋ฐ๊พผ ํ break
- queue์ ์ฒซ ๋ฒ์งธ ๊ฐ์ด result-1 ๊ฐ๊ณผ ๊ฐ์ง ์์ผ๋ฉด 1์ด์ ํด๋นํ๋ ๋งํผ ์ฌ๋์ด ์ด๋ํ๋ค๋ ๋ป์ด๋ฏ๋ก break
- ๋ถ ์ด๋
์๊ฐ๐ค
์ฒ์์ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ ์ด์ ๋ ๋งค๋ฒ ๊ณ์ํด์ ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํ์ฌ ๋ถ์ ์์น์ ์ฌ๋์ ์์น๋ฅผ ๊ฐ queue์ ๋ฃ์ด์ฃผ๋ ์์ ์ ํ๊ธฐ ๋๋ฌธ์ด์๋ค. ์ด ๋ถ๋ถ์ ๋ฐ๊พธ๋ ์ด๋ฒ์๋ ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ๊ฐ ๋ฐ์ํ์๋ค. ์ด ๋ถ๋ถ์ ์ฌ๋์ด ์ด๋ํ ๋ map์ ์ง๋๊ฐ ์ ์๋ ๊ณต๊ฐ์ผ๋ก ๋ค์ ๋ฐ๊ฟ์ค์ผ๋ก์จ ๋์์ด ์ค๋ณต๋์ด ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ด๋ผ ์๊ฐํ์๋ค. ์ด ๋ถ๋ถ์ ๊ณ ์น๊ณ ์กฐ๊ฑด์ ์กฐ๊ธ ๋ ๊ณ ์น๋ ํต๊ณผํ ์ ์์๋ค.
'๐Algorithm > ๐ฅBaekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Baekjoon] 13459_๊ตฌ์ฌ ํ์ถ (0) | 2022.12.20 |
---|---|
[Baekjoon] 13460_๊ตฌ์ฌ ํ์ถ 2 (0) | 2022.12.19 |
[Baekjoon] 16953_A โ B (0) | 2022.12.14 |
[Baekjoon] 10769_ํ๋ณตํ์ง ์ฌํ์ง (0) | 2022.12.13 |
[Baekjoon] 18405_๊ฒฝ์์ ์ ์ผ (1) | 2022.12.12 |