[JAVA] 백준 16918번 : 봄버맨

2025. 6. 27. 14:02·Algorithm

[16918번 : 봄버맨] - Silver1


[ 문제 ]

봄버맨은 크기가 R×C인 직사각형 격자판 위에서 살고 있다. 격자의 각 칸은 비어있거나 폭탄이 들어있다.

 

폭탄이 있는 칸은 3초가 지난 후에 폭발하고, 폭탄이 폭발한 이후에는 폭탄이 있던 칸이 파괴되어 빈 칸이 되며, 인접한 네 칸도 함께 파괴된다. 즉, 폭탄이 있던 칸이 (i, j)인 경우에 (i+1, j), (i-1, j), (i, j+1), (i, j-1)도 함께 파괴된다. 만약, 폭탄이 폭발했을 때, 인접한 칸에 폭탄이 있는 경우에는 인접한 폭탄은 폭발 없이 파괴된다. 따라서, 연쇄 반응은 없다.

 

봄버맨은 폭탄에 면역력을 가지고 있어서, 격자판의 모든 칸을 자유롭게 이동할 수 있다. 봄버맨은 다음과 같이 행동한다.

 

  1. 가장 처음에 봄버맨은 일부 칸에 폭탄을 설치해 놓는다. 모든 폭탄이 설치된 시간은 같다.
  2. 다음 1초 동안 봄버맨은 아무것도 하지 않는다.
  3. 다음 1초 동안 폭탄이 설치되어 있지 않은 모든 칸에 폭탄을 설치한다. 즉, 모든 칸은 폭탄을 가지고 있게 된다. 폭탄은 모두 동시에 설치했다고 가정한다.
  4. 1초가 지난 후에 3초 전에 설치된 폭탄이 모두 폭발한다.
  5. 3과 4를 반복한다.

 

폭탄을 설치해놓은 초기 상태가 주어졌을 때, N초가 흐른 후의 격자판 상태를 구하려고 한다.

 

예를 들어, 초기 상태가 아래와 같은 경우를 보자.

...

.O.

...

 

1초가 지난 후에는 아무 일도 벌어지지 않기 때문에, 위와 같다고 볼 수 있다. 1초가 더 흐른 후에 격자판의 상태는 아래와 같아진다.

OOO

OOO

OOO

 

1초가 지난 후엔 가운데에 있는 폭탄이 폭발해 가운데 칸과 인접한 네 칸이 빈 칸이 된다.

O.O

...

O.O

[ 입력 ]

첫째 줄에 R, C, N (1 ≤ R, C, N ≤ 200)이 주어진다. 둘째 줄부터 R개의 줄에 격자판의 초기 상태가 주어진다. 빈 칸은 '.'로, 폭탄은 'O'로 주어진다.


[ 출력 ]

총 R개의 줄에 N초가 지난 후의 격자판 상태를 출력한다.

# 예제 입력 1
6 7 3
.......
...O...
....O..
.......
OO.....
OO.....

# 예제 출력 1
OOO.OOO
OO...OO
OOO...O
..OO.OO
...OOOO
...OOOO

# 예제 입력 2
6 7 4
.......
...O...
....O..
.......
OO.....
OO.....

# 예제 출력 2
OOOOOOO
OOOOOOO
OOOOOOO
OOOOOOO
OOOOOOO
OOOOOOO

[ Code ]

import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
    static int r, c;
    static char[][] pre, cur;
    static boolean[][] visited;
    static int[] dy = {-1, 1, 0, 0};
    static int[] dx = {0, 0, -1, 1};

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(br.readLine());
        r = Integer.parseInt(st.nextToken());
        c = Integer.parseInt(st.nextToken());
        int n = Integer.parseInt(st.nextToken());
        pre = new char[r][c];
        cur = new char[r][c];

        int time = 1;
        for (int i = 0; i < r; i++) {
            String str = br.readLine();
            for (int j = 0; j < c; j++) {
                cur[i][j] = str.charAt(j);
            }
        }

        if (n == 1) {
            for (int i = 0; i < r; i++) {
                for (int j = 0; j < c; j++) {
                    bw.write(cur[i][j]);
                }
                bw.write("\n");
            }
        } else {
            while (time < n) {
                time++;
                if (time % 2 == 0) {
                    for (int i = 0; i < r; i++) {
                        pre[i] = Arrays.copyOf(cur[i], c);
                    }
                    allBomb();
                } else {
                    visited = new boolean[r][c];
                    explosion();
                }
            }

            for (int i = 0; i < r; i++) {
                for (int j = 0; j < c; j++) {
                    bw.write(cur[i][j]);
                }
                bw.write("\n");
            }
        }
        bw.close();
    }

    static void allBomb() {
        for (int i = 0; i < r; i++) {
            for (int j = 0; j < c; j++) {
                cur[i][j] = 'O';
            }
        }
    }

    static void explosion() {
        for (int i = 0; i < r; i++) {
            for (int j = 0; j < c; j++) {
                if (pre[i][j] == 'O') {
                    cur[i][j] = '.';
                    for (int idx = 0; idx < 4; idx++) {
                        int nextY = i + dy[idx];
                        int nextX = j + dx[idx];

                        if (isValid(nextY, nextX) && !visited[nextY][nextX] && cur[nextY][nextX] == 'O') {
                            visited[nextY][nextX] = true;
                            cur[nextY][nextX] = '.';
                        }
                    }
                }
            }
        }
    }

    static boolean isValid(int y, int x) {
        return y >= 0 && x >= 0 && y < r && x < c;
    }
}
  • pre 배열 : 이전 배열
  • cur 배열 : 현재 배열
  • n이 짝수라면 모두 설치된 배열만 출력한다. -> cur배열을 pre 배열에 복사해놓고, cur 배열에 모두 폭탄 설치
  • n이 홀수라면 pre 배열에 있는 폭탄을 참고하여, 모두 폭탄으로 되어 있는 cur 배열에서 폭탄을 터뜨린다.
  • 폭탄이 있는 자리라면 상, 하, 좌, 우를 순회하며 폭탄을 모두 터뜨린다.

 

 

반응형

'Algorithm' 카테고리의 다른 글

[JAVA] 백준 5427번 : 불  (1) 2025.07.03
[JAVA] 백준 14267번 : 회사 문화 1  (0) 2025.07.02
[JAVA] 백준 2015번 : 수들의 합 4  (0) 2025.06.13
[JAVA] 백준 26169번 : 세 번 이내에 사과를 먹자  (1) 2025.06.10
[JAVA] 백준 1744번 : 수 묶기  (0) 2025.06.03
'Algorithm' 카테고리의 다른 글
  • [JAVA] 백준 5427번 : 불
  • [JAVA] 백준 14267번 : 회사 문화 1
  • [JAVA] 백준 2015번 : 수들의 합 4
  • [JAVA] 백준 26169번 : 세 번 이내에 사과를 먹자
ssu_dev
ssu_dev
  • ssu_dev
    ssu
    ssu_dev
  • 전체
    오늘
    어제
    • 분류 전체보기 (98)
      • Cloud (10)
      • HCI (2)
      • Algorithm (54)
      • Programming (13)
      • Computer Science (5)
      • System (6)
      • Trouble Shooting (6)
      • Work (1)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 인기 글

  • 태그

    bfs
    BOJ
    구현
    OS
    Java
    docker
    priorityqueue
    Deque
    자료구조
    Karpenter
    sort
    Pod Scheduling
    dfs
    Stack
    K8s
    투포인터
    cs
    node scaling
    EKS
    플로이드 워셜
  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
ssu_dev
[JAVA] 백준 16918번 : 봄버맨
상단으로

티스토리툴바