본문 바로가기

ALGORITHM

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

1. 문제 링크

 

17144번: 미세먼지 안녕!

미세먼지를 제거하기 위해 구사과는 공기청정기를 설치하려고 한다. 공기청정기의 성능을 테스트하기 위해 구사과는 집을 크기가 R×C인 격자판으로 나타냈고, 1×1 크기의 칸으로 나눴다. 구사

www.acmicpc.net

 

2. 문제 및 입출력예제

 

3. 문제 풀이

입력받으면서 공기청정기 위치를 저장하고, 미세먼지가 있으면 전체 합에 추가한다.

미세먼지 확산과 공기청정기를 순서에 맞게 진행한다.

미세먼지 확산 후 양을 저장할 새로운 배열을 만들어서 5로 나눈 값을 사방에 저장하고, 원래 위치는 그만큼 뺀다. 

모든 과정이 끝나면 확산된 배열에 있는 값을 기존 배열에 저장한다.

공기청정기는 배열 돌리기를 이용했다.

이 과정을 T초만큼 반복하면 된다.

 

4. 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main {
	static int R, C, T, map[][], tempMap[][];
	static int cleanerX;
	static int answer = 0;
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String[] split = br.readLine().split(" ");
		R = Integer.parseInt(split[0]);
		C = Integer.parseInt(split[1]);
		T = Integer.parseInt(split[2]);
	
		map = new int[R][C];
		for(int i=0;i<R;i++) {
			split = br.readLine().split(" ");
			for(int j=0;j<C;j++) {
				int a = Integer.parseInt(split[j]);
				if(a == -1) {
					cleanerX = i;
				}
				map[i][j] = a;
				if(a > 0) {
					answer += a;
				}
			}
		}
		
		for(int t=0;t<T;t++) {
			spread();
			clean();
		}
		System.out.println(answer);
		
	}
	static int dx[] = {0, 0, -1, 1};
	static int dy[] = {-1, 1, 0, 0};
	private static void spread() {
		tempMap = new int[R][C];
		for(int i=0;i<R;i++) {
			for(int j=0;j<C;j++) {
				if(map[i][j]>0) {
					int now = map[i][j]/5;
					for(int d=0;d<4;d++) {
						int X = i+dx[d];
						int Y = j+dy[d];
						if(X>=0 && X<R && Y>=0 && Y<C) {
							if(map[X][Y] >= 0) {
								tempMap[X][Y] += now;
								map[i][j] -= now;
							}
						}
					}
				}
			}
		}

		for(int i=0;i<R;i++) {
			for(int j=0;j<C;j++) {
				map[i][j]+=tempMap[i][j];
			}
		}
		
	}
	
	private static void clean() {
		answer -= map[cleanerX - 2][0];
		answer -= map[cleanerX + 1][0];
		//아래로
		for(int i=cleanerX - 2;i>0;i--) {
			map[i][0] = map[i-1][0];
		}
		//왼쪽으로
		for(int j=0;j<C-1;j++) {
			map[0][j] = map[0][j+1];
		}
		//위로
		for(int i=0;i<cleanerX-1;i++) {
			map[i][C-1] = map[i+1][C-1];
		}
		//오른쪽으로
		for(int j=C - 1;j > 1;j--) {
			map[cleanerX-1][j] = map[cleanerX-1][j-1];
		}
		
		//위로
		for(int i=cleanerX + 1;i<R - 1;i++) {
			map[i][0] = map[i+1][0];
		}
		//왼쪽으로
		for(int j=0;j<C-1;j++) {
			map[R - 1][j] = map[R - 1][j+1];
		}		
		//아래로
		for(int i=R - 1;i>cleanerX;i--) {
			map[i][C - 1] = map[i-1][C - 1];
		}		
		//오른쪽으로
		for(int j=C - 1;j>1;j--) {
			map[cleanerX][j] = map[cleanerX][j - 1];
		}	
        
		map[cleanerX][1] = 0;
		map[cleanerX - 1][1] = 0;
	}
}

 

'ALGORITHM' 카테고리의 다른 글