All :L

[BOJ/Java] 봄버맨 (16918) 본문

CODING/BOJ

[BOJ/Java] 봄버맨 (16918)

ofijwe 2024. 8. 30. 00:52
반응형

봄버맨 (16918)

1. 문제 분석

문제 개요

  • 주어진 격자판에 폭탄을 설치하고 시간이 흐름에 따라 폭탄이 터지도록 하는 시뮬레이션 문제이다. 초기 상태에서 폭탄이 설치된 위치와 시간이 주어지며, 이후 폭탄이 터지고 새로운 폭탄이 설치되는 과정이 반복된다.

입력 형식

  • 첫 줄에 행(R)과 열(C)의 크기, 그리고 시뮬레이션 시간(N)이 공백으로 구분되어 주어진다.
  • 이후 R개의 줄에 걸쳐 C개의 문자가 주어지며, .은 빈 칸, O는 폭탄이 설치된 칸을 의미한다.

출력 형식

  • 시뮬레이션이 끝난 후의 격자판 상태를 출력한다.

2. 알고리즘 종류

  • 이 문제는 시뮬레이션 알고리즘을 사용하는 문제이다. 주어진 규칙에 따라 시간을 경과시키면서 상태 변화를 처리해야 한다. 특히, 폭탄이 터지는 시간과 새로운 폭탄 설치 등을 순서대로 처리해야 한다.

3. 주요 부분 및 코드 작성 방법

1. 시뮬레이션 흐름 관리

  • 시간을 순차적으로 증가시키며, 짝수 시간대에는 폭탄을 설치하고 홀수 시간대에는 폭탄을 터뜨리는 과정 반복

2. 폭탄 설치 및 폭발 처리

  • 폭탄을 설치할 때마다 설치 시간을 기록하고, 해당 시간이 되면 폭발시켜 주변 칸도 함께 처리한다.

4. 코드 설명

(1) 메인 함수 (main)

  • 입력 처리:
    • 행, 열, 그리고 시간을 입력받아 변수에 저장한다.
  • R = Integer.parseInt(st.nextToken()); // 행의 수 C = Integer.parseInt(st.nextToken()); // 열의 수 N = Integer.parseInt(st.nextToken()); // 시간
  • 초기화 및 입력된 위치 저장
    • 격자와 폭탄 설치 시간을 저장할 배열을 초기화한다.
  • bomb = new char[R][C]; // 격자 상태 저장 bombtime = new int[R][C]; // 폭탄 설치 시간 저장
  • 시간 경과에 따른 폭탄 설치 및 폭발 시뮬레이션
    • 주어진 시간(N)까지 반복하며, 짝수 시간에는 폭탄을 설치하고 홀수 시간에는 폭탄을 터뜨린다.
  • while(time++ < N) { if(time % 2 == 0) install(); // 짝수 시간에는 폭탄 설치 else if(time % 2 == 1) boom(); // 홀수 시간에는 폭탄 폭발 }
  • 결과 출력
    • 시뮬레이션이 끝난 후 격자의 상태를 출력한다.
  • for (int i = 0; i < R; i++) { System.out.println(bomb[i]); }

(2) 폭탄 설치 함수 (install)

  • 폭탄 설치
    • 빈 칸에 폭탄을 설치하고, 폭탄이 터질 시간을 설정한다.
  • if (bomb[i][j] == '.') { bomb[i][j] = 'O'; // 비어있는 모든 칸에 폭탄 설치 bombtime[i][j] = time + 3; // 폭탄 설치 후 터질 시간 설정 }

(3) 폭탄 폭발 함수 (boom)

  • 폭탄 폭발 및 인접 칸 처리
    • 폭탄이 터지면 그 위치를 비워두고, 인접한 칸에 있는 폭탄도 함께 터지도록 처리한다.
  • if (bombtime[i][j] == time) { bomb[i][j] = '.'; // 폭탄이 터짐 for (int d = 0; d < 4; d++) { int nx = i + dx[d]; int ny = j + dy[d]; if (nx < 0 || ny < 0 || nx >= R || ny >= C) continue; // 범위 밖 체크 if(bomb[nx][ny]=='O' && bombtime[nx][ny] != time) { bomb[nx][ny] = '.'; // 인접 폭탄도 함께 터짐 bombtime[nx][ny] = 0; // 해당 칸 초기화 } } }

5. 전체 코드

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

public class Main {
    static int R, C, N;  // 행, 열, 시간
    static char[][] bomb;  // 폭탄 상태
    static int[][] bombtime;  // 폭탄이 터질 시간

    static int time = 0;  // 현재 시간
    static int[] dx = {1, -1, 0, 0};  // 방향 배열 (상하좌우)
    static int[] dy = {0, 0, 1, -1};

    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());  // 시간

        bomb = new char[R][C];  // 격자 상태 저장
        bombtime = new int[R][C];  // 폭탄 설치 시간 저장

        for (int i = 0; i < R; i++) {
            String s = br.readLine();
            for (int j = 0; j < C; j++) {
                bomb[i][j] = s.charAt(j);
                if(bomb[i][j]=='O'){
                    bombtime[i][j] = 3;  // 폭탄이 터질 시간 (설치된 시간 + 3초)
                }
            }
        }

        // N초가 흐를 때까지 반복
        while(time++ < N) {
            if(time % 2 == 0) install();  // 짝수 시간에는 폭탄 설치
            else if(time % 2 == 1) boom();  // 홀수 시간에는 폭탄 폭발
        }

        // 결과 출력
        for (int i = 0; i < R; i++) {
            System.out.println(bomb[i]);
        }

    }

    // 폭탄 설치
    static void install() {
        for (int i = 0; i < R; i++) {
            for (int j = 0; j < C; j++) {
                if (bomb[i][j] == '.') {
                    bomb[i][j] = 'O';  // 비어있는 모든 칸에 폭탄 설치
                    bombtime[i][j] = time + 3;  // 폭탄 설치 후 터질 시간 설정
                }
            }
        }
    }

    // 폭탄 폭발
    static void boom() {
        for (int i = 0; i < R; i++) {
            for (int j = 0; j < C; j++) {
                if (bombtime[i][j] == time) {
                    bomb[i][j] = '.';  // 폭탄이 터짐
                    for (int d = 0; d < 4; d++) {  // 상하좌우 인접한 칸 체크
                        int nx = i + dx[d];
                        int ny = j + dy[d];

                        if (nx < 0 || ny < 0 || nx >= R || ny >= C) continue;  // 범위 밖 체크

                        if(bomb[nx][ny]=='O' && bombtime[nx][ny] != time) { 
                            bomb[nx][ny] = '.';  // 인접 폭탄도 함께 터짐
                            bombtime[nx][ny] = 0;  // 해당 칸 초기화
                        }
                    }
                }
            }
        }
    }
}
반응형

'CODING > BOJ' 카테고리의 다른 글

[BOJ/Java] Puyo Puyo (11559)  (0) 2024.08.30
[BOJ/Java] 그림 (1926)  (0) 2024.08.30
[BOJ/Java] 농장 관리 (1245)  (0) 2024.08.29
[BOJ/Java] 양 한마리... 양 두마리... (11123)  (0) 2024.08.29
[BOJ/Java] 치즈 (2638)  (0) 2024.08.29
Comments