안드 공부를 해볼까?

[Java] 백준 봄버맨 본문

알고리즘/백준

[Java] 백준 봄버맨

문바리 2022. 6. 28. 18:43
728x90

1. 문제분석

격자판 위에 봄버맨이 폭탄을 놓는다.

그 후 폭탄이 설치되지 않는 곳에 폭탄을 둔다, 즉 모든 칸이 폭탄이 있는 상태다.

그 후 앞서 봄버맨이 설치한 폭탄이 터진다, 여기서 중요한 점은 폭탄이 터진다면 연쇄 폭발은 나오지 않는다.

즉, 폭탄이 터지면 그 곳은 평지가 되는 것이다.

 

이제 순서대로 생각해보자.

0초 -> 봄버맨이 폭탄 설치(설치한 폭탄은 3초)

1초 -> 아무것도 하지 않음(설치한 폭탄은 2초)

2초 -> 나머지 빈 공간에 폭탄설치(봄버맨이 설치한 폭탄 1초, 빈 공간 폭탄 3초)

3초 -> 봄버맨이 설치한 폭탄 폭발(빈 공간 폭탄 2초)

4초 -> 아무것도 하지 않음(빈 공간 폭탄 1초)

5초 -> 빈 공간 폭탄 폭발

 

즉, 2초부터 홀수면 폭발, 짝수면 폭탄 설치가 되는 것이다.

추가적으로 사방면으로 터지기 때문에 인덱스 오류를 처리해줘야한다.

2. 구현

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] inputs = br.readLine().split(" ");

        int height = Integer.parseInt(inputs[0]);
        int width = Integer.parseInt(inputs[1]);
        int time = Integer.parseInt(inputs[2]);

        char[][] map = new char[height][width];
        int[][] timeMap = new int[height][width];

        int currentTime = 0;
        int[] heightRange = {1, -1, 0, 0};
        int[] widthRange = {0, 0, 1, -1};

        for (int i = 0; i < height; i++) {
            String inputWidthInfo = br.readLine();
            for (int j = 0; j < width; j++) {
                map[i][j] = inputWidthInfo.charAt(j);
                //폭탄 설치
                if (map[i][j] == 'O') {
                    timeMap[i][j] = 3;
                }
            }
        }

        while (currentTime++ < time) {
            //폭탄 설치
            if (currentTime % 2 == 0) {
                for (int i = 0; i < height; i++) {
                    for (int j = 0; j < width; j++) {
                        if (map[i][j] == '.') {
                            map[i][j] = 'O';
                            timeMap[i][j] = currentTime + 3;
                        }
                    }
                }
            }
            //폭탄 터지는 타이밍
            else if (currentTime % 2 == 1) {
                for (int i = 0; i < height; i++) {
                    for (int j = 0; j < width; j++) {
                        if (timeMap[i][j] == currentTime) {
                            map[i][j] = '.';
                            for (int boomArea = 0; boomArea < 4; boomArea++) {
                                int heightBoomArea = i + heightRange[boomArea];
                                int widthBoomArea = j + widthRange[boomArea];

                                //인덱스 오류나온다면 continue
                                if (heightBoomArea < 0 || widthBoomArea < 0 || heightBoomArea >= height || widthBoomArea >= width)
                                    continue;
                                //연쇄 폭발은 안됨, 그냥 폭탄이 없는 것으로 취급
                                if (map[heightBoomArea][widthBoomArea] == 'O' && timeMap[heightBoomArea][widthBoomArea] != currentTime) {
                                    map[heightBoomArea][widthBoomArea] = '.';
                                    timeMap[heightBoomArea][widthBoomArea] = 0;
                                }
                            }
                        }
                    }
                }
            }
        }


        for (int i = 0; i < height; i++) {
            System.out.println(map[i]);
        }

    }
}

폭탄과 평지가 있는 map, 폭탄의 시간을 나타내는 timeMap으로 나눴다.

timeMap과 현재 시간이 같다면 폭탄은 터지는 것이다. 터졌을 때 사방면에 폭탄이 있다면 그 폭탄은 없어지게 된다.

3. 마무리

면접 준비로 인해 오랜만에 풀어보는 알고리즘이었다.

진짜 다 까먹었다...

반응형

'알고리즘 > 백준' 카테고리의 다른 글

[Java] 백준 연속합  (0) 2022.08.02
[Java] 백준 토마토  (0) 2022.06.28
[Java] 백준 LCS  (0) 2022.06.14
[Java] 백준 평범한 배낭  (0) 2022.06.14
[Java] 백준 계단 오르기  (0) 2022.06.07
Comments