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

백준 17144번 : 미세먼지 안녕! java

by LDY3838 2022. 6. 9.
반응형

이 문제는 조건에 따라서 미세먼지를 확산시킨 후 공기청정기를 작동시키는 문제입니다.

저는 이 문제를 확산시키는 함수와 공기청정기에 의해서 미세먼지들이 이동하는 함수로 나누어 풀었습니다.

 

우선 확산시키는 함수는 map배열을 검사하며 미세먼지의 농도가 5 이상일 때만 ArraList에 입력했습니다.

그 후 ArrayList에 있는 데이터들을 꺼내서 그 주변으로 확산시켰습니다.

미세먼지의 농도가 5 이상일 때 바로 확산시키지 않은 이유는 바로 확산시킨다면 확산된 미세먼지가 주변에 영향을 주어서

제대로 정답을 구하기 어렵기 때문입니다.

 

그 후 미세먼지들을 이동시키는 함수를 실행시켰습니다.

코드를 보면 이해하실 수 있으실 겁니다.


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

public class Main {
    static int[][] map;
    static int R, C;
    static int[] dRow = {1, -1, 0, 0};
    static int[] dCol = {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());
        int T = Integer.parseInt(st.nextToken());

        map = new int[R][C];
        int cleanR = -1;

        for(int i = 0; i<R; i++){
            st = new StringTokenizer(br.readLine());

            for(int j = 0; j<C; j++) {
                int a = Integer.parseInt(st.nextToken());
                map[i][j] = a;

                if(a == -1 && cleanR == -1)
                    cleanR = i;
            }
        }

        while(T-->0){
            spread();
            move(cleanR);
        }

        int sum = 0;
        for(int i = 0; i<R; i++)
            for (int j = 0; j < C; j++)
                sum += map[i][j];

        System.out.println(sum+2);
    }

    //미세먼지 확산
    static void spread(){
        List<Data> l = new ArrayList<>();

        for(int i = 0; i<R; i++)
            for(int j = 0; j<C; j++)
                if(map[i][j]>=5)
                    l.add(new Data(i, j, map[i][j]));

        for (Data data : l) {
            int count = 0;

            int r = data.row;
            int c = data.col;
            int v = data.val;

            for (int j = 0; j < 4; j++) {
                int dr = r + dRow[j];
                int dc = c + dCol[j];

                if (dr < 0 || dc < 0 || dr >= R || dc >= C)
                    continue;
                if (map[dr][dc] == -1)
                    continue;

                map[dr][dc] += v / 5;
                count++;
            }

            map[r][c] -= v / 5 * count;
        }
    }

    //공기청정기 가동
    static void move(int cleanR){
        for(int i = cleanR-2; i>=0; i--)
            map[i+1][0] = map[i][0];
        for(int i = 0; i<C-1; i++)
            map[0][i] = map[0][i+1];
        for(int i = 0; i<cleanR; i++)
            map[i][C-1] = map[i+1][C-1];
        for(int i = C-1; i>1; i--)
            map[cleanR][i] = map[cleanR][i-1];
        map[cleanR][1] = 0;

        for(int i = cleanR+2; i<R-1; i++)
            map[i][0] = map[i+1][0];
        for(int i = 0; i<C-1; i++)
            map[R-1][i] = map[R-1][i+1];
        for(int i = R-1; i>cleanR+1; i--)
            map[i][C-1] = map[i-1][C-1];
        for(int i = C-1; i>1; i--)
            map[cleanR+1][i] = map[cleanR+1][i-1];
        map[cleanR+1][1] = 0;
    }
}

class Data{
    int row, col, val;

    Data(int row, int col, int val){
        this.row = row;
        this.col = col;
        this.val = val;
    }
}
반응형

댓글