백준 16918 봄버맨 (Java,자바)

jonghyukLee·2022년 8월 29일
0

이번에 풀어본 문제는
백준 16918번 봄버맨 입니다.

📕 문제 링크

❗️코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    static int R,C,N;
    static char [][] map;
    static int [][] boomTime;
    static int [] dx = {-1,1,0,0};
    static int [] dy = {0,0,-1,1};
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        R = Integer.parseInt(st.nextToken());
        C = Integer.parseInt(st.nextToken());
        N = Integer.parseInt(st.nextToken());

        map = new char[R][C];
        boomTime = new int[R][C];

        int curTime = 0;

        for (int i = 0; i < R; i++) {
            String str = br.readLine();

            for (int j = 0; j < C; j++) {
                char c = str.charAt(j);
                map[i][j] = c;
                if (c == 'O') {
                    boomTime[i][j] = curTime + 3;
                }
            }
        }

        // 1초 아무것도 안함
        curTime++;

        while (++curTime <= N) {
            if (curTime % 2 == 0) setBomb(curTime);
            else boom(curTime);
        }

        StringBuilder sb = new StringBuilder();
        for (char [] arr : map) {
            for (char c : arr) {
                sb.append(c);
            }
            sb.append("\n");
        }

        System.out.print(sb);
    }

    static void setBomb(int curTime) {
        int setTime = curTime + 3;
        for (int i = 0; i < R; i++) {
            for (int j = 0; j < C; j++) {
                if (map[i][j] == '.') {
                    map[i][j] = 'O';
                    boomTime[i][j] = setTime;
                }
            }
        }
    }
    static void boom(int curTime) {
        for (int i = 0; i < R; i++) {
            for (int j = 0; j < C; j++) {
                if (boomTime[i][j] == curTime) {
                    map[i][j] = '.';
                    boomTime[i][j] = 0;

                    for (int idx = 0; idx < 4; idx++) {
                        int mx = i + dx[idx];
                        int my = j + dy[idx];

                        if (!isValid(mx, my) || boomTime[mx][my] == curTime) continue;

                        map[mx][my] = '.';
                        boomTime[mx][my] = 0;
                    }
                }
            }
        }
    }

    static boolean isValid(int x, int y) {
        return x >= 0 && y >= 0 && x < R && y < C;
    }
}

📝 풀이

봄버맨이 짝수 시간에는 폭탄을 설치하고, 홀수 시간에는 터뜨립니다.
모든 폭탄은 설치 3초 후에 동시에 폭발하며, 연쇄폭발은 없습니다.
주어진 그대로 현재 상태를 담은 map 배열과, 폭발 시간을 담은 boomTime 배열을 활용하여 해결할 수 있습니다.

📜 후기

처음에 큐를 사용한 방식을 택했는데, set이 올바르게 들어가지 않아서 이유를 모른 채 해결하지 못했습니다. 지금 생각으로는 도저히 이해가 가지 않는데, 다음에 큐를 사용해서 다시 풀어볼 생각입니다.

profile
머무르지 않기!

0개의 댓글