티스토리 뷰
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
'Problem Solving' 카테고리의 다른 글
[BOJ 15684] 사다리 조작 (Java) (0) | 2022.04.23 |
---|---|
[프로그래머스] N으로 표현 (Java) (0) | 2022.04.23 |
[BOJ 23288] 주사위 굴리기 2 (Java) (0) | 2022.04.21 |
[BOJ 20061] 모노미노도미노2 (Java) (0) | 2022.04.21 |
[BOJ 21610] 마법사 상어와 비바라기 (Java) (0) | 2022.04.19 |