백준 17144 풀이

남기용·2021년 6월 12일
0

백준 풀이

목록 보기
65/109

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


미세먼지 안녕

풀이

그냥 무지성으로 문제의 조건에 맞게 해결하면 된다.

끝!!!

코드

import java.io.*;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;

public class Main {
    static int[] dx = {-1, 0, 0, 1};
    static int[] dy = {0, -1, 1, 0};
    static int r, c;
    static int t;
    static int[][] room;
    static ArrayList<Integer> airCleaner;

    public static void main(String[] args) throws IOException {
        // write your code here
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        String[] first = br.readLine().split(" ");
        r = Integer.parseInt(first[0]);
        c = Integer.parseInt(first[1]);
        t = Integer.parseInt(first[2]);

        room = new int[r][c];
        airCleaner = new ArrayList<>();

        for (int i = 0; i < r; i++) {
            String[] line = br.readLine().split(" ");
            for (int j = 0; j < line.length; j++) {
                int a = Integer.parseInt(line[j]);
                if (a == -1)
                    airCleaner.add(i);
                room[i][j] = a;
            }
        }

        for (int i = 0; i < t; i++) {
            spreadDust();
            //printRoom();
            refresh();
            //printRoom();
        }

        int answer = calcDust();
        bw.write(answer+"\n");

        bw.close();
        br.close();
    }

    private static void spreadDust() {
        Queue<Pair> queue = new LinkedList<>();
        for (int i = 0; i < r; i++) {
            for (int j = 0; j < c; j++) {
                if (room[i][j] > 0) {
                    queue.offer(new Pair(i, j, room[i][j]));
                }
            }
        }

        while (!queue.isEmpty()) {
            Pair p = queue.poll();
            int count = 0;
            for (int i = 0; i < 4; i++) {
                int nx = p.x + dx[i];
                int ny = p.y + dy[i];
                if ((nx >= 0 && nx < r) && (ny >= 0 && ny < c)) {
                    if (room[nx][ny] != -1) {
                        room[nx][ny] = room[nx][ny] + (p.dust / 5);
                        count++;
                    }
                }
            }
            room[p.x][p.y] = room[p.x][p.y] - p.dust + p.dust - ((p.dust / 5) * count);
        }
    }

    private static void refresh() {
        int upper = airCleaner.get(0);
        int down = airCleaner.get(1);

        int next = room[0][0];
        for (int i = 0; i < upper; i++) {
            if (room[i + 1][0] != -1) {
                int temp = room[i + 1][0];
                room[i + 1][0] = next;
                next = temp;
            }
        }
        for (int i = 1; i < c; i++) {
            room[0][i - 1] = room[0][i];
        }
        for (int i = 0; i < upper; i++) {
            room[i][c - 1] = room[i + 1][c - 1];
        }
        next = room[upper][1];
        room[upper][1] = 0;
        for (int i = 2; i < c; i++) {
            int temp = room[upper][i];
            room[upper][i] = next;
            next = temp;
        }
        for (int i = down + 1; i < r - 1; i++) {
            room[i][0] = room[i + 1][0];
        }
        for (int i = 1; i < c; i++) {
            room[r - 1][i - 1] = room[r - 1][i];
        }
        next = room[down][c - 1];
        for (int i = down + 1; i < r; i++) {
            int temp = room[i][c -1];
            room[i][c - 1] = next;
            next = temp;
        }
        next = room[down][1];
        room[down][1] = 0;
        for (int i = 2; i < c; i++) {
            int temp = room[down][i];
            room[down][i] = next;
            next = temp;
        }
    }

    private static int calcDust() {
        int answer = 0;
        for(int i = 0;i<r;i++) {
            for(int j = 0;j<c;j++) {
                if(room[i][j] > 0)
                    answer += room[i][j];
            }
        }
        return answer;
    }

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

class Pair {
    public int x;
    public int y;
    public int dust;

    public Pair(int x, int y, int dust) {
        this.x = x;
        this.y = y;
        this.dust = dust;
    }
}
profile
개인용 공부한 것을 정리하는 블로그입니다.

0개의 댓글