Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

Life Engineering

[BOJ 17144] 미세먼지 안녕! (Java) 본문

Problem Solving

[BOJ 17144] 미세먼지 안녕! (Java)

흑개 2022. 4. 23. 01:47

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

 

17144번: 미세먼지 안녕!

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

www.acmicpc.net

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

public class Main_BOJ_17144 {
	static int[] dr= {-1,1,0,0};
	static int[] dc= {0,0,-1,1};
	static int R, C, T;
	static int[][] map;
	static int air_r=-1, air_c=-1;
	static int r, c;
	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());
		T=Integer.parseInt(st.nextToken());
		map=new int[R][C];
		for (int i=0; i<R; i++) {
			st=new StringTokenizer(br.readLine());
			for (int j=0; j<C; j++) {
				map[i][j]=Integer.parseInt(st.nextToken());
				if (map[i][j]==-1 && air_r==-1 && air_c==-1) {
					air_r=i; 
					air_c=j;
				}
			}
		}
		for (int i=0; i<T; i++) {
			spreadDust();
			purify();
/*			for (int j=0; j<R; j++) {
			System.out.println(Arrays.toString(map[j]));
			}*/
		}
		int answer=0;
		for (int i=0; i<R; i++) {
			for (int j=0; j<C; j++) {
				if (map[i][j]>0) answer+=map[i][j];
			}
		}
		System.out.println(answer);

	}

	private static void spreadDust() {
		int[][] temp=new int[R][C];
		int nr, nc;
		for (int i=0; i<R; i++) {
			for (int j=0; j<C; j++) {
				if (map[i][j]>0) {
					int cnt=0;
					for (int d=0; d<4; d++) {
						nr=i+dr[d];
						nc=j+dc[d];
						if (nr<0 || nc<0 || nr>=R || nc>=C || map[nr][nc]==-1) continue;
						temp[nr][nc]+=(map[i][j]/5);
						cnt++;
					}
					temp[i][j]+=(map[i][j]-((map[i][j]/5)*cnt));
				}
			}
		}
		map=temp;
		map[air_r][air_c]=-1;
		map[air_r+1][air_c]=-1;
	}
	
	private static void purify() {
		r=air_r-2;
		c=air_c;
		map[air_r-1][air_c]=0;
		map[air_r+2][air_c]=0;
		up(0);
		r+=1;
		c+=1;
		right(C);
		c-=1;
		r+=1;
		down(air_r);
		r-=1;
		c-=1;
		left(1);
		map[r][c+1]=0;
		r=air_r+3;		//bottom
		c=air_c;
		down(R-1);
		r-=1;
		c+=1;
		right(C);
		c-=1;
		r-=1;
		up(air_r+1);
		r+=1;
		c-=1;
		left(1);
		map[r][c+1]=0;
	}
	
	private static void up(int N) {
		while (r>=N) {		//상
			map[r+1][c]=map[r][c];
			r-=1;
		}
	}
	private static void right(int N) {
		while (c<N) {		//우
			map[r][c-1]=map[r][c];
			c+=1;
		}
	}
	private static void down(int N) {
		while (r<=N) {		//하
			map[r-1][c]=map[r][c];
			r+=1;
		}
	}
	private static void left(int N) {
		while (c>=N) {		//좌
			map[r][c+1]=map[r][c];
			c-=1;
		}
	}
	

}

시뮬레이션+구현 문제이다

 

미세먼지가 확산되는 부분은 temp 배열을 이용해서 값을 ++ 시키고 이를 map에 대입해주는 식으로 진행했다.

 

공기 청정기가 작동되는 부분은 위쪽 방향 같은 경우 up, right, down, left 순서대로 움직여주면서 값이 있을 경우 이전 위치에 그 값을 넣어주는 형태로 작동을 구현했다. 아래쪽 방향 같은 경우 down, right, up, left 순서대로 움직여주면서 마찬가지로 같은 방식으로 구현했다. 

 

다른 분(https://donggoolosori.github.io/2020/10/20/boj-17144/) 의 코드를 보니 for 문을 이용해 더 깔끔하게 구현할 수 있다.

f