문제는 다음과 같다.
https://www.acmicpc.net/problem/16918
풀이는 다음과 같다.
import java.io.*;
import java.util.*;
public class Main {
static int[][] map;
static int[] dr = {-1, 1, 0, 0}; //상하좌우 순
static int[] dc = {0, 0, -1, 1};
static int R, C, N;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st1 = new StringTokenizer(br.readLine());
R = Integer.parseInt(st1.nextToken());
C = Integer.parseInt(st1.nextToken());
N = Integer.parseInt(st1.nextToken());
map = new int[R][C];
for(int i = 0 ; i < R ; i++) {
String line = br.readLine();
for(int j = 0 ; j < C ; j++) {
if(line.substring(j, j+1).equals("O")) map[i][j] = 1; //폭탄있음
}
}
int time = 1;
while(time != N) {
if(time%2 == 1) {
installBomb();
}
else {
removeBomb();
}
time++;
}
//여기까지 오면 상황 끝.
for(int i = 0 ; i < R ; i++) {
for(int j = 0 ; j < C ; j++) {
if(map[i][j] == 0) {
bw.write(".");
}
else {
bw.write("O");
}
}
bw.write("\n");
}
bw.flush();
bw.close();
}
static void installBomb() {
for(int i = 0 ; i < R ; i++) {
for(int j = 0 ; j < C ; j++) {
map[i][j]++; //폭탄 없는곳에 폭탄 설치 map[i][j] = 1; 과 map[i][j]++; 두개 다르다
//폭탄이 없는곳에만 설치 + 있는 폭탄은 시간 더해주기가 위의 한줄으로 가능하다.
}
}
}
static void removeBomb() {
for(int i = 0 ; i < R ; i++) {
for(int j = 0 ; j < C ; j++) {
map[i][j]++;
}
}
int[][] temp = new int[R][C]; //초기 상태를 기록해놓고 그 기록을 기반으로 로직을 짜야함
for(int i = 0 ; i < R ; i++) {
for(int j = 0 ; j < C ; j++) {
temp[i][j] = map[i][j];
}
}
for(int i = 0 ; i < R ; i++) {
for(int j = 0 ; j < C ; j++) {
if(temp[i][j] >= 3) { //폭탄이 터질 시간이 지났다면
map[i][j] = 0; //해당 점 폭탄 터짐
for(int k = 0 ; k < 4 ; k++) {
int r = i + dr[k];
int c = j + dc[k];
if(r >= 0 && c >= 0 && r < R && c < C) { //index 알맞다면
map[r][c] = 0; //연쇄 폭발 점
}
}
}
}
}
}
}
내가 헷갈렸던 부분은,
내가 활용해야 할 정보는 폭탄의 위치 행렬, 그리고 폭탄이 몇초 지났는지 알아야 한다.
즉, 숫자 세개의 정보를 담고 있어야 하는데,
나는
String[][] 으로 map을 받아서, 더 어렵게 풀었다.
그렇게 받고,
해쉬맵으로 따로 폭탄을 표현했다.
key 값으로 폭탄의 위치 int[], value 값으로 폭탄의 시간 Integer
하지만!! int[][] 로 map을 받는다면, 폭탄의 위치 행렬 그리고 폭탄이 몇초 지났는지, 폭탄이 없다면 0으로 전부 표현 가능하다.
이렇게 더 쉽게 푸는법은 항상 있다.
문제 풀때 생각을 해보자.
폭탄의 위치와 시간을 나타내야한다...
-> 2차원배열의 index로 위치를 나타낼 수 있고
-> 해당 배열이 가지는 값으로 폭탄의 시간을 나타낼 수 있다.
-> 그럼, 위에서 언급한 해쉬맵은 불필요하다.
항상 내 풀이보다 더 나은 풀이는 있다고 생각하고 풀자.