플밍/문제풀이

백준4179 : 불!

kkap999 2023. 9. 19. 23:35
728x90

https://www.acmicpc.net/problem/4179

 

4179번: 불!

입력의 첫째 줄에는 공백으로 구분된 두 정수 R과 C가 주어진다. 단, 1 ≤ R, C ≤ 1000 이다. R은 미로 행의 개수, C는 열의 개수이다. 다음 입력으로 R줄동안 각각의 미로 행이 주어진다. 각각의 문자

www.acmicpc.net

구현 문제이니만큼 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