본문 바로가기

OJ

[BOJ] 16918 봄버맨 (JAVA)

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

 

16918번: 봄버맨

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

www.acmicpc.net

구현 문제입니다.

홀수 초에 할 일, 짝수 초에 할 일로 구분해서 쉽게 풀 수 있었습니다.

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {

    public static void main(String[] args) throws Exception {

        int[] dr = { -1,  0,  1,  0 };
        int[] dc = {  0,  1,  0, -1 };
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        int R = Integer.parseInt(st.nextToken());
        int C = Integer.parseInt(st.nextToken());
        int N = Integer.parseInt(st.nextToken());
        Queue<int[]> q = new LinkedList<>();
        char[][] arr = new char[R][C];
        for (int i = 0; i < R; i++) {
            arr[i] = br.readLine().toCharArray();
            for (int j = 0; j < C; j++) {
                if(arr[i][j] == 'O') q.offer(new int[] { i, j });
            }
        } // end of input

        int time = 0;

        while(++time < N) {

            // 폭탄 놓기
            if(time % 2 == 1) {

                for (int i = 0; i < R; i++) {
                    for (int j = 0; j < C; j++) {
                        if(arr[i][j] == '.') arr[i][j] = 'O';
                        else q.offer(new int[] { i, j });
                    }
                }

            // 터트리기
            } else {

                while(!q.isEmpty()) {
                    int[] pos = q.poll();

                    arr[pos[0]][pos[1]] = '.';
                    for (int dir = 0; dir < 4; dir++) {
                        int nr = pos[0] + dr[dir];
                        int nc = pos[1] + dc[dir];

                        if(0 <= nr && nr < R && 0 <= nc && nc < C) arr[nr][nc] = '.';
                    }
                }

            }

        }

        for (int i = 0; i < R; i++) {
            for (int j = 0; j < C; j++) {
                sb.append(arr[i][j]);
            }
            sb.append("\n");
        }

        System.out.print(sb.toString());

    }

}

'OJ' 카테고리의 다른 글

[BOJ] 5427 불 (JAVA)  (0) 2023.01.07
[BOJ] 11967 불켜기 (JAVA)  (2) 2023.01.06
[BOJ] 1026 보물 (JAVA)  (0) 2023.01.04
[BOJ] 17182 우주 탐사선 (JAVA)  (2) 2023.01.03
[BOJ] 2750 수 정렬하기 (JAVA)  (0) 2023.01.02