0. 같은 코드로 봄버맨1(링크)도 해결 가능하다
1. 시작 직후를 제외하면, 빈공간을 채운다 - 터진다 - 빈공간을 채운다 - 터진다 - ... 순으로 반복되게 된다
2. 특정 시점 x에 폭탄이 놓인다면, x+1시점에는 x-2때 설치된 폭탄들이 터지며 방금 놓인 폭탄 중 일부가 제거된다
- 이때 제거된 폭탄들은, x시점에 놓인 폭탄들 중 외곽과 닿은 폭탄들이다
3. x+2시점에는 새 폭탄이 설치되고, x+3시점에는 x때 설치된 폭탄들이 터지며 x+2폭탄 중 일부가 제거된다
- 이때 제거된 폭탄들은, x시점에 놓인 폭탄들과 닿은 폭탄들이다
4. 즉, 2번에서 제거된 폭탄들과 3번에서 제거된 폭탄들은 그 위치가 같다
- 얼음의 겉이 1칸 녹은 후, 다시 겉을 얼린다면 처음 그대로의 상태일 것
- 항상 같은 위치를 제거해가며, 4초를 주기로 무한루프하게 된다
5. 즉 시작 직후만 따로 처리해주고, 나머지는 4로 나눈 만큼 진행하면 된다
- 이때, 폭탄이 설치되는 짝수 시간에는 모든 칸에 폭탄이 위치하므로 진행할 필요 없이 처리 가능하다
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main{
static int[][]map;
static final int empty=-1;
public static void main(String[] args)throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int r = pint(st.nextToken());
int c = pint(st.nextToken());
int n = pint(st.nextToken());
map = new int[r][c];
for (int i = 0; i < r; i++) {
String s = br.readLine();
for (int j = 0; j < c; j++) {
map[i][j]=s.charAt(j)=='.'?empty:0;
}
}
if(n==1) {
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
sb.append(map[i][j]==empty?'.':'O');
}sb.append("\n");
}
}
else if(n%2==0) {
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
sb.append("O");
}sb.append("\n");
}
}
else {
n=n%4+4;
for(int i = 2; i <= n; i++) {
if(i%2==0) {
set(true, i);
}
else {
set(false,i);
}
}
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
sb.append(map[i][j]==empty?'.':'O');
}sb.append("\n");
}
}
System.out.println(sb);
}
static void set(boolean mode, int time) {
if(mode) {//set
for (int i = 0; i < map.length; i++) {
for (int j = 0; j < map[0].length; j++) {
if(map[i][j]==empty)map[i][j]=time;
}
}
}
else {
for (int i = 0; i < map.length; i++) {
for (int j = 0; j < map[0].length; j++) {
if(map[i][j]==time-3)bomb(i,j,time-3);
}
}
}
}
static void bomb(int x, int y, int time) {
map[x][y]=empty;
if(y<map[0].length-1 && map[x][y+1]!=time)map[x][y+1]=empty;
if(y>0 && map[x][y-1]!=time)map[x][y-1]=empty;
if(x < map.length-1 && map[x+1][y]!=time)map[x+1][y]=empty;
if(x>0 &&map[x-1][y]!=time)map[x-1][y]=empty;
}
static int pint(String s) {
return Integer.parseInt(s);
}
}
'알고리즘 문제 풀이 > BOJ 골드' 카테고리의 다른 글
[백준] 1339 - 단어수학 (0) | 2021.10.10 |
---|---|
[백준] 14938 - 서강그라운드 (0) | 2021.10.03 |
[백준] 14891 - 톱니바퀴 (0) | 2021.09.27 |
[백준] 4256 - 트리 (0) | 2021.09.25 |
[백준] 20056 - 마법사 상어와 파이어볼 (0) | 2021.09.07 |
[백준] 6198 - 옥상 정원 꾸미기 (0) | 2021.08.27 |
[백준] 2075 - N번째 큰 수 (0) | 2021.08.27 |