백준 16918번 봄버맨

이상민·2023년 9월 26일
0

알고리즘

목록 보기
63/128
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import java.util.StringTokenizer;

public class BoomberMan {
    static int R,C,N;
    static char[][] map;
    static char[][] map2;
    static char[][] all;
    static int[] dr = {0,1,0,-1};
    static int[] dc = {1,0,-1,0};
    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];
        map2 = new char[R][C];
        char[][] initmap = new char[R][C];
        all = new char[R][C];

        for (int i = 0; i < R; i++) {
            String str = br.readLine();
            for (int j = 0; j < C; j++) {
                initmap[i][j] = str.charAt(j);
                map[i][j] = 'O';
                map2[i][j] = 'O';
                all[i][j] = 'O';
            }
        }
        for (int i = 0; i < R; i++) {
            for (int j = 0; j < C; j++) {
                if(initmap[i][j]=='O'){
                    Bomb(i,j);
                }
            }
        }
        for (int i = 0; i < R; i++) {
            for (int j = 0; j < C; j++) {
                if(map[i][j]=='O'){
                    Bomb2(i,j);
                }
            }
        }

        StringBuilder initprint = new StringBuilder();
        for (int i = 0; i < R; i++) {
            initprint.append(initmap[i]).append("\n");
        }
        StringBuilder bombprint = new StringBuilder();
        for (int i = 0; i < R; i++) {
            bombprint.append(map[i]).append("\n");
        }
        StringBuilder allprint = new StringBuilder();
        for (int i = 0; i < R; i++) {
            allprint.append(all[i]).append("\n");
        }
        StringBuilder bomb2print = new StringBuilder();
        for (int i = 0; i < R; i++) {
            bomb2print.append(map2[i]).append("\n");
        }
        if(N==1){
            System.out.println(initprint);
            return;
        }
        if(N%2==0){
            System.out.println(allprint);
        }
        else if(N%4==1)
            System.out.println(bomb2print);
        else if(N%4==3)
            System.out.println(bombprint);
    }
    public static void Bomb(int row, int col){
        map[row][col] = '.';
        for (int i = 0; i < 4; i++) {
            int nrow = row + dr[i];
            int ncol = col + dc[i];
            if(nrow<0||ncol<0||nrow>=R||ncol>=C)
                continue;
            map[nrow][ncol] = '.';
        }
    }
    public static void Bomb2(int row, int col){
        map2[row][col] = '.';
        for (int i = 0; i < 4; i++) {
            int nrow = row + dr[i];
            int ncol = col + dc[i];
            if(nrow<0||ncol<0||nrow>=R||ncol>=C)
                continue;
            map2[nrow][ncol] = '.';
        }
    }
}

풀이방법

📢 이문제의 핵심은 초에 따라 일정 장면이 반복되서 출력된다는 점이다.
첫번째 장면 : 초기 입력값 map
두번째 장면 : 전부 O
세번째 장면 : 초기 입력값에서 폭발한 map
네번째 장면 : 세번째 장면에서 폭발한 map

따라서 N이 1 일때를 제외하고, 2초마다 두번째 장면 출력,
N%4 == 1 경우에는 세번째 장면 출력
N%4 == 3 경우에는 네번째 장면 출력
이러한 방식으로 출력되어야 한다.
🔉예제에서는 마치 첫번째 장면과 네번째 장면이 같은것처럼 나온다.
하지만 반례가 있기에 따로 구분해주어야 한다.

  1. 각 장면에 해당하는 map을 모두 만들어준다.
  2. 세번째 장면은 초기입력값 initmap을 파라미터로 받아 폭발시켜준다.
  3. 네번째 장면은 2.에서 만든 map을 파라미터로 받아 폭발시켜준다.
  4. 출력시 각각 stringBuilder를 통해 출력해준다.

후기

첫번째 장면과 네번째 장면이 같다고 생각하고 풀었는데, 함정이 있었다.
규칙을 찾을때 신중하게 찾아야겠다.

profile
개린이

0개의 댓글