📍 문제 설명
💡 접근
1초 경과 - 그대로
2초 경과 - 모든 칸에 폭탄 설치
3초 경과 - 폭탄 설치된 칸에서 폭발(1초)
4초 경과 - 모든 칸에 폭탄 설치
5초 경과 - 3초 전에 설치된 폭탄이 폭발(3초)
2,3 4,5 초와 같이 설치, 폭발이 반복된다.
1.폭탄 좌표를 큐에 넣는다.
2.모든 좌표에 폭탄을 설치한다.
3.폭탄 좌표를 폭발시킨다.
1~3을 반복하면된다.
👩💻 코드
import java.util.*;
public class Main {
static int n, m, k, answer, cnt, max, min, sum, count, r, c;
static char[][] board, clone, dis;
static boolean[][] visited;
static int[] ch, pm, combi, graph, temp;
static boolean flag = false;
static int[] dx = {-1, 0, 1, 0,}; //북동남서
static int[] dy = {0, 1, 0, -1};
static ArrayList<Integer> list = new ArrayList<>();
static Queue<Point> q;
public static void main(String[] args) {
Main T = new Main();
Scanner kb = new Scanner(System.in);
r = kb.nextInt();
c = kb.nextInt();
n = kb.nextInt();
board = new char[r][c];
kb.nextLine();
//3초가 지난뒤 폭발(해당 칸 포함 상하좌우 파괴)
//인접한 칸에 폭탄이 있으면 파괴만 된다.
for(int i = 0; i < r; i++) {
String s = kb.nextLine();
for(int j = 0; j < c; j++) {
board[i][j] = s.charAt(j);
}
}
T.solution(1);
}
private void solution(int second) {
q = new LinkedList<>();
if(second == n) {
for(int i = 0; i < r; i++) {
for(int j = 0; j < c; j++) {
System.out.print(board[i][j]);
}
System.out.println();
}
return;
}
//폭탄 좌표 큐에 넣기
for(int i = 0; i < r; i++) {
for(int j = 0; j < c; j++) {
if(board[i][j] == 'O') q.offer(new Point(i, j));
}
}
//폭탄이 없는 곳 모든 칸에 폭탄 설치 - 1초 증가
for(int i = 0; i < r; i++) {
for(int j = 0; j < c; j++) {
if(board[i][j] == '.') board[i][j] = 'O';
}
}
second++;
if(second == n) {
solution(second);
return;
}
//좌표를 기준으로 상하좌우 폭발 - 1초 증가
while(!q.isEmpty()) {
Point cp = q.poll();
board[cp.x][cp.y] = '.';
for(int i = 0; i < 4; i++) {
int nx = cp.x + dx[i];
int ny = cp.y + dy[i];
if(nx<0 || ny<0 || nx>=r || ny>=c) continue;
board[nx][ny] = '.';
}
}
second++;
solution(second);
}
private static class Point {
private int x;
private int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public String toString() {
return "Point{" +
"x=" + x +
", y=" + y +
'}';
}
}
}