All :L
[BOJ/Java] 봄버맨 (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