[백준] 17144번 미세먼지 안녕! (java, 구현)
728x90
반응형
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
반응형
'백준' 카테고리의 다른 글
[백준] 20056번 마법사 상어와 파이어볼 (java, 구현, bfs) (0) | 2021.04.15 |
---|---|
[백준] 7569번 토마토 (java, 3차원 bfs) (0) | 2021.04.14 |
[백준] 7576번 토마토 (bfs) (0) | 2021.04.14 |
[백준] 17413번 단어 뒤집기 2 (JAVA, 구현) (0) | 2021.04.11 |
[백준] 19532번 수학은 비대면 강의입니다. (java, 완전탐색) (0) | 2021.04.09 |
TAGS.