코딩문제풀이/Baekjoon

[Java] 백준 16918번 : 봄버맨

코딩하는 포메라니안 2022. 12. 9. 22:44

1. 문제

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

 

16918번: 봄버맨

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

www.acmicpc.net

 

 

2. 풀이과정

문제분석

2단계에서 이미 설치된 폭탄은 무조건 다음 단계에서 터지게 되어있다.

[case1] 초기에 설치된 폭탄은 1초 대기후, 2단계 => 3단계를 거치기 때문에 3초에 터진다.

[case2] 2단계에서 새로 설치한 폭탄 => 3=>2(이미 설치된 폭탄으로 취급됨)=>3단계에서 터진다. 

 

구현방법

1. 이미 설치된 폭탄의 위치를 배열에 저장

2. 다음 단계(주어진 문제에서 3단계에 해당)에서 4방향 탐색을 하며 '.'으로 폭탄이 터진 것을 표시해준다.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class Main {
    static int R, C, N;
    static int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};
    static char map[][];

    public static void simulation(){
        ArrayList<int[]> bombs = new ArrayList<>();
        for(int t=0; t<N; t++){
            if(t%2==0){
                for(int i=0; i<R; i++){
                    for(int j=0; j<C; j++){
                        if(map[i][j]=='.'){map[i][j] = 'O';}
                        else{bombs.add(new int[]{i, j});}
                    }
                }
            }
            else{
                for(int[] bomb : bombs){
                    map[bomb[0]][bomb[1]] = '.';
                    for(int k=0; k<4; k++){
                        int nx = bomb[0]+dx[k];
                        int ny = bomb[1]+dy[k];
                        if(nx<0 || nx>=R || ny<0 || ny>=C){ continue;}
                        map[nx][ny] = '.';
                    }
                }
                bombs = new ArrayList<>();
            }

        }
    }

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String inputs[] = br.readLine().split(" ");
        R = Integer.parseInt(inputs[0]);
        C = Integer.parseInt(inputs[1]);
        N = Integer.parseInt(inputs[2])-1;
        map = new char[R][C];

        for(int i=0; i<R; i++){
            String input = br.readLine();
            for(int j=0; j<C; j++){
                map[i][j] = input.charAt(j);
            }
        }
        //
        simulation();

        StringBuilder sb = new StringBuilder();
        for(int i=0; i<R; i++){
            for(int j=0; j<C; j++){
                sb.append(map[i][j]);
            }
            sb.append("\n");
        }
        System.out.println(sb.toString());
    }
}

 

 

결과