알고리즘

[백준17144] - 미세먼지 안녕! - 자바(JAVA)

사랑박 2023. 4. 15. 03:08

1. 문제

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

 

17144번: 미세먼지 안녕!

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

www.acmicpc.net

 

2. 풀이

미세먼지가 확산, 공기청정기작동 2단계로 나누어서 코드를 작성했다.

 

미세먼지 확산

value라는 R*C 크기의 배열을 새로 만든다.

(0,0)부터 (R-1)(C-1)까지 탐색하면서 먼지가 있으면 먼지가 확산되는 양(A/5)을 계산하여 value에 더한다.

마지막에 value값을 map에 더함

 

공기청정기 작동

공기청정기가 작동하는 방향대로 먼지를 ArrayList에 순서대로 저장한다.

한 칸씩 밀어주면 되므로 map[R][2]부터 ArrayList 값을 get해서 넣어준다.

 

 

3. 코드

import java.util.ArrayList;
import java.util.Scanner;

public class boj17144 {

	static int R,C,T;
	static int[][] map;
	static int start;
	
	public static void main(String[] args) {
		
		Scanner sc=new Scanner(System.in);
		
		R=sc.nextInt();
		C=sc.nextInt();
		T=sc.nextInt();
		
		map=new int[R][C];
		
		
		for(int i=0;i<R;i++) {
			for(int j=0;j<C;j++) {
				map[i][j]=sc.nextInt();
				if(map[i][j]==-1) {
					start=i;
				}
			}
		}
		
		for(int i=0;i<T;i++) {
			spread();
			
			circulate();
		}
		
		int result=0;
		
		for(int i=0;i<R;i++) {
			for(int j=0;j<C;j++) {
				if(map[i][j]!=-1) result+=map[i][j];
			}
		}
		
		System.out.println(result);
	}

	public static void spread() {
		int[][] value=new int[R][C];
		for(int i=0;i<R;i++) {
			for(int j=0;j<C;j++) {
				if(map[i][j]>0) {
					spread_fun(i,j,value);
				}
			}
		}
		for(int i=0;i<R;i++) {
			for(int j=0;j<C;j++) {
				map[i][j]+=value[i][j];
			}
		}
	}
	
	public static void spread_fun(int row,int col,int[][] value) {
		int amount=map[row][col]/5;
		int cnt=0;
		int r[]= {-1,0,1,0};
		int c[]= {0,1,0,-1};
		for(int i=0;i<4;i++) {
			int next_row=row+r[i];
			int next_col=col+c[i];
			if(next_row>=R||next_col>=C||next_row<0||next_col<0) continue;
			if(map[next_row][next_col]==-1) continue;
			value[next_row][next_col]+=amount;
			
			cnt++;
		}
		map[row][col]=map[row][col]-(amount*cnt);
	}
	
	public static void circulate() {
		int dir_r[]= {0,-1,0,1};
		int dir_c[]= {1,0,-1,0};

		circulate_fun(dir_r,dir_c,start-1);
		
		int dir_r2[]= {0,1,0,-1};
		int dir_c2[]= {1,0,-1,0};
		
		circulate_fun(dir_r2,dir_c2,start);
		
	}
	
	public static void circulate_fun(int[] dir_r,int[] dir_c,int r) {
		ArrayList<Integer> arr=new ArrayList<>();
		
		int i=0;
		int c=1;
		
		while(map[r][c]!=-1) {
			arr.add(map[r][c]);
			int next_r=r+dir_r[i];
			int next_c=c+dir_c[i];
			if(next_r>=R||next_r<0||next_c>=C||next_c<0) {
				i++;
				r+=dir_r[i];
				c+=dir_c[i];
			}else {
				r=next_r;
				c=next_c;
			}
		}
		//
		i=0;
		c=2;
		int j=0;
		map[r][1]=0;
		while(map[r][c]!=-1) {
			map[r][c]=arr.get(j);
			j++;
			int next_r=r+dir_r[i];
			int next_c=c+dir_c[i];
			if(next_r>=R||next_r<0||next_c>=C||next_c<0) {
				i++;
				r+=dir_r[i];
				c+=dir_c[i];
			}else {
				r=next_r;
				c=next_c;
			}
		}
	}	
}