백준 16918 봄버맨 자바

꾸준하게 달리기~·2023년 6월 23일
0
post-thumbnail

문제는 다음과 같다.
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로 위치를 나타낼 수 있고
-> 해당 배열이 가지는 값으로 폭탄의 시간을 나타낼 수 있다.
-> 그럼, 위에서 언급한 해쉬맵은 불필요하다.


항상 내 풀이보다 더 나은 풀이는 있다고 생각하고 풀자.

profile
반갑습니다~! 좋은하루 보내세요 :)

0개의 댓글