본문 바로가기

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' 카테고리의 다른 글

백준 1717 집합의 표현 (Java)  (0) 2023.03.25
백준 2805 나무 자르기 (Java)  (0) 2023.03.24
백준 15683 감시 (Java)  (0) 2023.03.22
백준 1018 체스판 다시 칠하기 (Java)  (0) 2023.03.21
백준 1495 기타리스트 (Java)  (0) 2023.03.21