백준 17144 - 미세먼지 안녕!(java)

Mendel·2024년 9월 28일

알고리즘

목록 보기
79/85

문제 접근

사실 그냥 구현 시뮬레이션 문제라서 별다른 접근법은 없다.
하지만, 주의해야할 점이 있다. 필자는 여기서 많이 틀렸다..
바로, 공기청정기가 바람을 쏜 위치의 시작 지점의 값을 0으로 초기화 해야 한다는 것이다.
그리고, 공기청정기가 있는 위치는 항상 -1이라는 것을 기억하며 코드를 작성해야 한다.

문제 풀이

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;

public class Main {

    static int R, C, T;
    static int[][][] map;
    static int airMachineFirstPosition;
    static int airMachineSecondPosition;

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

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        R = Integer.parseInt(st.nextToken());
        C = Integer.parseInt(st.nextToken());
        T = Integer.parseInt(st.nextToken());

        map = new int[T + 1][R][C];
        for (int i = 0; i < R; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < C; j++) {
                map[0][i][j] = Integer.parseInt(st.nextToken());
            }
        }

        boolean isAppearAirMachineFirstPosition = false;
        for (int i = 0; i < R; i++) {
            if (map[0][i][0] == -1) {
                if (!isAppearAirMachineFirstPosition) {
                    airMachineFirstPosition = i;
                    isAppearAirMachineFirstPosition = true;
                } else {
                    airMachineSecondPosition = i;
                    break;
                }
            }
        }

        for (int t = 0; t < T; t++) {
            step(map[t], t);
        }

        int result = 0;
        for (int i = 0; i < R; i++) {
            for (int j = 0; j < C; j++) {
                if (map[T][i][j] > 0) {
                    result += map[T][i][j];
                }
            }
        }
        System.out.println(result);
    }

    static void step(int[][] curMap, int t) {
        for (int i = 0; i < R; i++) {
            for (int j = 0; j < C; j++) {
                if (curMap[i][j] > 0) {
                    int div = curMap[i][j] / 5;
                    int spreadCount = 0;
                    for (int k = 0; k < 4; k++) {
                        int nextX = i + dx[k];
                        int nextY = j + dy[k];
                        if (isIn(nextX, nextY) && curMap[nextX][nextY] >= 0) {
                            map[t + 1][nextX][nextY] += div;
                            spreadCount++;
                        }
                    }
                    map[t + 1][i][j] += (curMap[i][j] - div * spreadCount);
                } else if (curMap[i][j] == -1) {
                    map[t + 1][i][j] = -1;
                }
            }
        }

        move(map[t + 1]);
    }

    private static void move(int[][] map) {
        int previous = map[airMachineFirstPosition][1];
        map[airMachineFirstPosition][1] = 0;
        for (int j = 2; j < C; j++) {
            int tmp = map[airMachineFirstPosition][j];
            map[airMachineFirstPosition][j] = previous;
            previous = tmp;
        }
        for (int i = airMachineFirstPosition - 1; i >= 0; i--) {
            int tmp = map[i][C - 1];
            map[i][C - 1] = previous;
            previous = tmp;
        }
        for (int j = C - 2; j >= 0; j--) {
            int tmp = map[0][j];
            map[0][j] = previous;
            previous = tmp;
        }
        for (int i = 1; i < airMachineFirstPosition; i++) {
            int tmp = map[i][0];
            map[i][0] = previous;
            previous = tmp;
        }

        previous = map[airMachineSecondPosition][1];
        map[airMachineSecondPosition][1] = 0;
        for (int j = 2; j < C; j++) {
            int tmp = map[airMachineSecondPosition][j];
            map[airMachineSecondPosition][j] = previous;
            previous = tmp;
        }
        for (int i = airMachineSecondPosition + 1; i < R; i++) {
            int tmp = map[i][C - 1];
            map[i][C - 1] = previous;
            previous = tmp;
        }
        for (int j = C - 2; j >= 0; j--) {
            int tmp = map[R - 1][j];
            map[R - 1][j] = previous;
            previous = tmp;
        }
        for (int i = R - 2; i > airMachineSecondPosition; i--) {
            int tmp = map[i][0];
            map[i][0] = previous;
            previous = tmp;
        }
    }

    static boolean isIn(int x, int y) {
        return x >= 0 && x < R && y >= 0 && y < C;
    }
}

profile
이것저것(안드로이드, 백엔드, AI, 인프라 등) 공부합니다

0개의 댓글