#문제
레벨: G4
알고리즘: 구현
풀이시간: 1시간
힌트 참조 유무:
https://www.acmicpc.net/problem/17144

#문제 풀이
제목이 상쾌하여 문제에 대한 호감도가 올라갔다. 풀면서 구현 문제에 적합한 것 같아 호감도가 더 올라갔다.
이문제에서 우리가 구현할 것은
1. 미세먼지 확산
2. 공기청정기 바람 부는 것
3 . 토탈 먼지 수 구하기
이 두가지이다. 1 ~ 2번을 T초 동안 반복 후 최종적으로 3번을 통해 답을 구하면 된다.
미세먼지 확산은 기존배열을 참조하여 temp(임시)배열에 값을 추가하거나 빼주면 된다................(1)
기존 배열을 수정하면 다른 미세먼지 확산을 계산할 때 영향을 미치기 때문에 일단은 temp배열에 다 계산해주고 기존 배열에서 모든 미세먼지를 탐색했다면 그제서야 temp배열에 있는 감들을 기존배열로 옮겨준다.
공기청정기 바람 부는 것은 아래 그림을 보면서 설명하겠다............................................................(2)
파란색 네모: 공기청정기
빨간색 숫자: 인덱스 채워지는 순서
총 for문을 4번해야 바람이 순환하는 것을 구현할 수 있다.
초록색 묶음 -> 노란색 묶음 -> 주황색 묶음 -> 갈색 묶음 이 순서대로 for문을 4개 만들어 빨간색 숫자대로 채워넣으면 구현이 된다. 검정색 동그라미 자리는 무조건 0이므로 마지막에 0을 입력해준다.
마찬가지로 아래 방향도 이와 같이 구현하면 된다.

배열을 전체 순회하며 숫자들을 합해준다.......................................................................................................(3)
#풀이 코드
import java.util.*;
public class Main {
static int R, C, T;
static int[][] room;
static int[] purifier = new int[2];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
R = sc.nextInt();
C = sc.nextInt();
T = sc.nextInt();
room = new int[R][C];
int purifierIndex = 0;
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
room[i][j] = sc.nextInt();
if (room[i][j] == -1) {
purifier[purifierIndex++] = i;
}
}
}
for (int t = 0; t < T; t++) {
spread();
purify();
}
System.out.println(getTotalDust());
}
static void spread() {
int[][] temp = new int[R][C];
int[] dx = {-1, 1, 0, 0};
int[] dy = {0, 0, -1, 1};
for (int x = 0; x < R; x++) {
for (int y = 0; y < C; y++) {
if (room[x][y] > 0) {
int amount = room[x][y] / 5;
int count = 0;
for (int d = 0; d < 4; d++) {
int nx = x + dx[d];
int ny = y + dy[d];
if (nx >= 0 && nx < R && ny >= 0 && ny < C && room[nx][ny] != -1) {
temp[nx][ny] += amount;
count++;
}
}
temp[x][y] += room[x][y] - amount * count;
}
}
}
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
if (room[i][j] != -1) {
room[i][j] = temp[i][j];
}
}
}
}
static void purify() {
// 위쪽 공기청정기
for (int i = purifier[0] - 1; i > 0; i--) room[i][0] = room[i-1][0];
for (int j = 0; j < C - 1; j++) room[0][j] = room[0][j+1];
for (int i = 0; i < purifier[0]; i++) room[i][C-1] = room[i+1][C-1];
for (int j = C - 1; j > 1; j--) room[purifier[0]][j] = room[purifier[0]][j-1];
room[purifier[0]][1] = 0;
// 아래쪽 공기청정기
for (int i = purifier[1] + 1; i < R - 1; i++) room[i][0] = room[i+1][0];
for (int j = 0; j < C - 1; j++) room[R-1][j] = room[R-1][j+1];
for (int i = R - 1; i > purifier[1]; i--) room[i][C-1] = room[i-1][C-1];
for (int j = C - 1; j > 1; j--) room[purifier[1]][j] = room[purifier[1]][j-1];
room[purifier[1]][1] = 0;
}
static int getTotalDust() {
int total = 0;
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
if (room[i][j] > 0) {
total += room[i][j];
}
}
}
return total;
}
}
'알고리즘 > 구현' 카테고리의 다른 글
[백준 14890] 경사로 / 자바 / 구현 (0) | 2024.08.06 |
---|---|
[백준 2504] 괄호의 값 / 자바 / 구현(괄호) (0) | 2024.08.02 |
[백준 20058] 마법사 상어와 파이어스톰 / 자바 / 구현 + bfs 조금 *** (0) | 2024.07.29 |
[백준 13458] 시험감독 / 자바 /그리드 (0) | 2024.07.03 |
[백준 3190] 뱀 / 자바 / 구현 (0) | 2024.07.03 |