728x90
https://www.acmicpc.net/problem/4179
구현 문제이니만큼 flow와 함수형 코딩을 중심으로 풀어봤다...
1. 변수 초기화
2. 지훈이가 이동
3. 불이 이동 -> 이 때 지훈이가 있는곳을 불이 덮는다면 지훈이는.... 😵
4. 지훈이가 이동할 곳이 없어지거나, 탈출에 성공하면 종료!
불과 지훈이가 이동하는 방식이 같기 때문에 재사용 가능한 함수를 만드는걸 좀 고민했다.
소스코드
package BOJ;
import java.io.*;
import java.util.*;
public class BOJ4179 {
private static final char JIHOON = 'J', FIRE = 'F';
private static int n, m;
private static Queue<Point> fireLocations, jihoonLocations;
private static char[][] map;
private static int[][] move = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
public static void main(String[] args) throws IOException {
init();
int ans = 0;
boolean isEscaped;
do {
ans++;
isEscaped = moving(jihoonLocations, JIHOON);
moving(fireLocations, FIRE);
} while (!jihoonLocations.isEmpty() && !isEscaped);
System.out.println(isEscaped ? ans : "IMPOSSIBLE");
}
private static boolean moving(Queue<Point> queue, final char FLAG) {
int size = queue.size();
while (size-- > 0) {
Point p = queue.poll();
if (FLAG == JIHOON && map[p.i][p.j] == FIRE) {
// 지훈이가 불로 뒤덮였다...
continue;
}
for (int d = 0; d < 4; d++) {
int ni = p.i + move[d][0];
int nj = p.j + move[d][1];
if (!checkIdx(ni, nj) && FLAG == JIHOON) {
// 탈출성공!
return true;
} else if (!checkIdx(ni, nj) || map[ni][nj] == '#' || map[ni][nj] == FLAG || map[ni][nj] == 'F') {
// 갈 수 없는곳
continue;
}
map[ni][nj] = FLAG;
queue.offer(new Point(ni, nj));
}
}
return false;
}
private static void init() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = parse(st.nextToken());
m = parse(st.nextToken());
map = new char[n][m];
fireLocations = new LinkedList<>();
jihoonLocations = new LinkedList<>();
for (int i = 0; i < n; i++) {
map[i] = br.readLine().toCharArray();
for (int j = 0; j < m; j++) {
if (map[i][j] == JIHOON) {
jihoonLocations.offer(new Point(i, j));
} else if (map[i][j] == FIRE) {
fireLocations.offer(new Point(i, j));
}
}
}
}
private static boolean checkIdx(int i, int j) {
return i >= 0 && j >= 0 && i < n && j < m;
}
private static class Point {
int i, j;
Point(int i, int j) {
this.i = i;
this.j = j;
}
}
private static int parse(String s) {
return Integer.parseInt(s);
}
}
'플밍 > 문제풀이' 카테고리의 다른 글
백준12919 : A와 B 2 (0) | 2024.02.27 |
---|---|
백준9184: 신나는 함수 실행(Java) (0) | 2024.02.27 |
백준17106 : 빙고 (0) | 2023.06.20 |
[Java] BOJ1256, 백준 - 사전 (0) | 2022.04.11 |
[Java] 프로그래머스 - 전력망을 둘로 나누기 (0) | 2022.04.05 |