1 분 소요



https://www.acmicpc.net/problem/16918



🔍 문제 풀이

문제 도식화

assets/images/2024/16918.jpg


💻 코드

import java.io.*;
import java.util.*;

public class Main {
    static int r, c, n;
    static char[][] bomb;
    static int[][] bombtime;

    static int[] dx = {-1, 1, 0, 0};
    static int[] dy = {0, 0, -1, 1};

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        r = Integer.parseInt(st.nextToken());
        c = Integer.parseInt(st.nextToken());
        n = Integer.parseInt(st.nextToken());

        bomb = new char[r][c];
        bombtime = new int[r][c];

        // 초기 상태
        for (int i = 0; i < r; i++) {
            String line = br.readLine();
            for (int j = 0; j < c; j++) {
                bomb[i][j] = line.charAt(j);
                if (bomb[i][j] == 'O') {
                    bombtime[i][j] = 3; // 처음 설치된 폭탄은 3초에 터짐
                }
            }
        }

        process();
    }

    static void process() {
        if (n == 1) { // 1초일 땐 초기 상태 그대로 출력
            print();
            return;
        }

        for (int time = 2; time <= n; time++) {
            if (time % 2 == 0) {
                // 짝수초: 빈칸에 폭탄 설치, 폭발시각은 time+3
                setBombs(time);
            } else {
                // 홀수초: 이번 시각에 맞춘 폭탄들 폭발
                getbomb(time);
            }
        }
        print();
    }


    // 빈칸에 폭탄 설치
    static void setBombs(int time) {
        for (int i = 0; i < r; i++) {
            for (int j = 0; j < c; j++) {
                if (bomb[i][j] == '.') {
                    bomb[i][j] = 'O'; // 비어있는 모든 칸에 폭탄 설치
                    bombtime[i][j] = time + 3;  // 폭탄 설치 후 터질 시간 설정
                }
            }
        }
    }

    // 이번 시각에 터질 폭탄 찾아서 처리
    public static void getbomb(int time) {
        for(int i=0; i<r; i++) {
            for(int j=0; j<c; j++) {
                if(bombtime[i][j] == time) {
                    bomb(i,j, time);
                }
            }
        }
    }

    // 폭탄 폭발
    static void bomb(int x, int y, int time) {
        bomb[x][y] = '.'
        bombtime[x][y] = 0;

        for (int d = 0; d < 4; d++) {
            int nx = x + dx[d];
            int ny = y + dy[d];

            if (nx < 0 || ny < 0 || nx >= r || ny >= c) continue;

            if(bomb[nx][ny]=='O' && bombtime[nx][ny] != time) { // 같은 시각에 터질 폭탄 건드리면 안됨 (주의)
                bomb[nx][ny] = '.';
                bombtime[nx][ny] = 0;
            }
        }

    }

    static void print() {
        for (int i = 0; i < r; i++) {
            for (int j = 0; j < c; j++){
                System.out.print(bomb[i][j]);
            }
            System.out.println();
        }
    }
}


카테고리:

업데이트:

댓글남기기