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;
}
}
}
}
'알고리즘' 카테고리의 다른 글
[백준20055] 컨베이어 벨트 위의 로봇 - 자바(JAVA) (0) | 2023.07.19 |
---|---|
[백준2178] 미로탐색 - 자바(JAVA) (0) | 2023.07.18 |
[백준15686] 치킨 배달 - 자바(JAVA) (0) | 2023.04.12 |
[백준15683] 감시 - 자바(JAVA) (0) | 2023.01.20 |
[백준 15685] 드래곤커브 - 자바(JVAVA) (0) | 2022.12.30 |