본문 바로가기
알고리즘/구현

[백준 17144] 미세먼지 안녕! / 자바 / 구현

by 순원이 2024. 8. 2.

#문제         

레벨: G4
알고리즘: 구현

풀이시간: 1시간
힌트 참조 유무:

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


#문제 풀이        

제목이 상쾌하여 문제에 대한 호감도가 올라갔다. 풀면서 구현 문제에 적합한 것 같아 호감도가 더 올라갔다.

이문제에서 우리가 구현할 것은

1. 미세먼지 확산

2. 공기청정기 바람 부는 것 

3 . 토탈 먼지  수 구하기

이 두가지이다. 1 ~ 2번을 T초 동안 반복 후 최종적으로 3번을 통해 답을 구하면 된다. 

 

미세먼지 확산은 기존배열을 참조하여 temp(임시)배열에 값을 추가하거나 빼주면 된다................(1)
기존 배열을 수정하면 다른 미세먼지 확산을 계산할 때 영향을 미치기 때문에 일단은 temp배열에 다 계산해주고 기존 배열에서 모든 미세먼지를 탐색했다면 그제서야 temp배열에 있는 감들을 기존배열로 옮겨준다. 

공기청정기 바람 부는 것은 아래 그림을 보면서 설명하겠다............................................................(2)

파란색 네모: 공기청정기
빨간색 숫자: 인덱스 채워지는 순서

총 for문을 4번해야 바람이 순환하는 것을 구현할 수 있다. 
초록색 묶음 -> 노란색 묶음 -> 주황색 묶음 -> 갈색 묶음 이 순서대로 for문을 4개 만들어 빨간색 숫자대로 채워넣으면 구현이 된다. 검정색 동그라미 자리는 무조건 0이므로 마지막에 0을 입력해준다. 

마찬가지로 아래 방향도 이와 같이 구현하면 된다.

 

 

배열을 전체 순회하며 숫자들을 합해준다.......................................................................................................(3)


#풀이 코드      

import java.util.*;

public class Main {
    static int R, C, T;
    static int[][] room;
    static int[] purifier = new int[2];

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        R = sc.nextInt();
        C = sc.nextInt();
        T = sc.nextInt();

        room = new int[R][C];
        int purifierIndex = 0;
        for (int i = 0; i < R; i++) {
            for (int j = 0; j < C; j++) {
                room[i][j] = sc.nextInt();
                if (room[i][j] == -1) {
                    purifier[purifierIndex++] = i;
                }
            }
        }

        for (int t = 0; t < T; t++) {
            spread();
            purify();
        }

        System.out.println(getTotalDust());
    }

    static void spread() {
        int[][] temp = new int[R][C];
        int[] dx = {-1, 1, 0, 0};
        int[] dy = {0, 0, -1, 1};

        for (int x = 0; x < R; x++) {
            for (int y = 0; y < C; y++) {
                if (room[x][y] > 0) {
                    int amount = room[x][y] / 5;
                    int count = 0;
                    for (int d = 0; d < 4; d++) {
                        int nx = x + dx[d];
                        int ny = y + dy[d];
                        if (nx >= 0 && nx < R && ny >= 0 && ny < C && room[nx][ny] != -1) {
                            temp[nx][ny] += amount;
                            count++;
                        }
                    }
                    temp[x][y] += room[x][y] - amount * count;
                }
            }
        }

        for (int i = 0; i < R; i++) {
            for (int j = 0; j < C; j++) {
                if (room[i][j] != -1) {
                    room[i][j] = temp[i][j];
                }
            }
        }
    }

    static void purify() {
        // 위쪽 공기청정기
        for (int i = purifier[0] - 1; i > 0; i--) room[i][0] = room[i-1][0];
        for (int j = 0; j < C - 1; j++) room[0][j] = room[0][j+1];
        for (int i = 0; i < purifier[0]; i++) room[i][C-1] = room[i+1][C-1];
        for (int j = C - 1; j > 1; j--) room[purifier[0]][j] = room[purifier[0]][j-1];
        room[purifier[0]][1] = 0;

        // 아래쪽 공기청정기
        for (int i = purifier[1] + 1; i < R - 1; i++) room[i][0] = room[i+1][0];
        for (int j = 0; j < C - 1; j++) room[R-1][j] = room[R-1][j+1];
        for (int i = R - 1; i > purifier[1]; i--) room[i][C-1] = room[i-1][C-1];
        for (int j = C - 1; j > 1; j--) room[purifier[1]][j] = room[purifier[1]][j-1];
        room[purifier[1]][1] = 0;
    }

    static int getTotalDust() {
        int total = 0;
        for (int i = 0; i < R; i++) {
            for (int j = 0; j < C; j++) {
                if (room[i][j] > 0) {
                    total += room[i][j];
                }
            }
        }
        return total;
    }
}