[백준] 17144번 미세먼지 안녕! (java, 구현)

728x90
반응형

www.acmicpc.net/problem/17144

 

17144번: 미세먼지 안녕!

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

www.acmicpc.net

 

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

class Pos{
	int y, x;

	public Pos(int y, int x) {
		super();
		this.y = y;
		this.x = x;
	}
	
}

public class Main {
	static int r,c,t;
	static int[][] map;
	static int[][] add;
	static int[] xpos= {1,-1,0,0};
	static int[] ypos= {0,0,1,-1};
	static int next,prev;
	static ArrayList<Pos> arr=new ArrayList<>();
	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) {
					arr.add(new Pos(i,j));
				}
			}
		}
		
		for (int i = 0; i < t; i++) {
			spread();
			int top=arr.get(0).y;
			rotateUp(top);
			int bottom=arr.get(1).y;
			rotateDown(bottom);
		}
		
		int answer=0;
		for (int i = 0; i < r; i++) {
			for (int j = 0; j < c; j++) {
				if(map[i][j]!=-1)
				answer+=map[i][j];
			}
		}
		System.out.println(answer);
	}
	
	private static void print() {
		for (int i = 0; i < r; i++) {
			for (int j = 0; j < c; j++) {
				System.out.print(map[i][j]+" ");
			}
			System.out.println();
		}
	}
	
	private static void right(int row) {
		prev=map[row][1];
		map[row][1]=0;
		for (int j = 2; j <= c-1; j++) {
			next=map[row][j];
			map[row][j]=prev;
			prev=next;
		}
	}
	
	private static void up(int row,int col,int to) {

		for (int i = row-1; i >=to; i--) {
			if(map[i][col]==-1)break;
			next=map[i][col];
			map[i][col]=prev;
			prev=next;
		}
	}
	
	private static void left(int row) {

		for (int j = c-2; j >=0; j--) {
			next=map[row][j];
			map[row][j]=prev;
			prev=next;
		}
	}
	
	private static void down(int row,int col,int to) {

		for (int i = row+1; i <=to; i++) {
			if(map[i][col]==-1)break;
			next=map[i][col];
			map[i][col]=prev;
			prev=next;
		}
	}


	private static void rotateUp(int row) {
		right(row);
		up(row,c-1,0);
		left(0);
		down(0,0,row);
	}
	
	
	private static void rotateDown(int row) {
		right(row);
		down(row,c-1,r-1);
		left(r-1);
		up(r-1,0,row);
	}

	private static void spread() {
		add=new int[r][c];
		//주변에 퍼뜨리기
		for (int i = 0; i < r; i++) {
			for (int j = 0; j < c; j++) {
				if(map[i][j]!=0 && map[i][j]!=-1) {
					int total=map[i][j];
					int amount=total/5;
					int cnt=0;
					for (int k = 0; k < 4; k++) {
						int y=i+ypos[k];
						int x=j+xpos[k];
						if(y<0 || x<0 || x>=c || y>=r)continue;
						if(map[y][x]==-1)continue; // 공기청정기로 가는 먼지는 사라짐
						add[y][x]+=amount;
						cnt+=1;
					}
					map[i][j]=total-cnt*amount;
				}
			}
		}
		//확산 받은 양 더하기 
		for (int i = 0; i < r; i++) {
			for (int j = 0; j < c; j++) {
				map[i][j]+=add[i][j];
			}
		}
		
	}
}
728x90
반응형
TAGS.

Comments