Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- java
- Kotlin
- 백준 14501
- SWEA
- 최단경로
- 순수함수
- 프로그래머스
- EditorInfo
- Parcelable
- hilt
- 백준
- imeOptions
- EditText
- Android
- 조합
- val
- 지능형 기차2
- 순열
- 완전탐색
- dfs
- 시뮬레이션
- 2501
- 자바
- BuildConfig
- Parcelize
- 오르막수
- 스카이라인 쉬운거
- BFS
- 백준 퇴사
- 약수 구하기
Archives
- Today
- Total
안드 공부를 해볼까?
[Java] 백준 봄버맨 본문
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