Problem
T
초가 지난 후 남아있는 미세 먼지들의 총 합을 구하는 문제입니다.
Solution
구현 문제입니다.
- 미세먼지 확산
- 공기청정기 가동
주의할 점은 미세먼지 확산 시 기존 배열 (아래 코드에서는 arr
) 을 바로 수정하지 않는 겁니다.
예를 들어 (1, 1) = 5, (1, 2) = 9 의 미세머지가 있다고 가정합니다.
만약 기존 배열을 그대로 수정하면 (1, 1) 에 있던 미세먼지를 먼저 확산시켜서 (1, 2) 의 미세먼지가 10 이 되고
반복문이 (1, 2) 위치에 도달했을 때 10 을 기준으로 확산하기 때문에 주변에 2 씩 퍼지게 됩니다.
그래서 미세먼지의 확산 결과를 temp
배열에다가 담았다가 arr
배열에 덮어쓰는 형식으로 구현했습니다.
공기청정기는 그냥 노가다로 구현했습니다.
Java Code
import java.util.*; import java.io.*; class Main { static int R, C, T; static int[][] arr = new int[50][50]; static List<Integer> airCleanerRows = new ArrayList<>(); static int sumOfDust = 2; public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st; // input st = new StringTokenizer(br.readLine()); R = Integer.parseInt(st.nextToken()); C = Integer.parseInt(st.nextToken()); T = Integer.parseInt(st.nextToken()); for (int i = 0; i < R; i++) { st = new StringTokenizer(br.readLine()); for (int j = 0; j < C; j++) { arr[i][j] = Integer.parseInt(st.nextToken()); sumOfDust += arr[i][j]; if (arr[i][j] == -1) { airCleanerRows.add(i); } } } // solution solution(); } static void solution() { while (T-- > 0) { // 1. 먼지 확산 arr = spreadDust(); // 2. 공기청정기 가동 executeAirCleaner(); } System.out.println(calculateSum()); } static int[][] spreadDust() { int[][] temp = new int[50][50]; int[] dx = {-1, 1, 0, 0}; int[] dy = {0, 0, -1, 1}; // 확산된 미세먼지를 temp 배열에 계산 for (int x = 0; x < R; x++) { for (int y = 0 ; y < C; y++) { if (arr[x][y] == -1) { temp[x][y] = -1; continue; } temp[x][y] += arr[x][y]; for (int i = 0; i < 4; i++) { int nx = x + dx[i]; int ny = y + dy[i]; if (nx < 0 || nx >= R || ny < 0 || ny >= C) continue; if (arr[nx][ny] == -1) continue; temp[nx][ny] += (arr[x][y] / 5); temp[x][y] -= (arr[x][y] / 5); } } } return temp; } static void executeAirCleaner() { // 위쪽 공기청정기는 반시계방향 int top = airCleanerRows.get(0); for (int x = top - 1; x > 0; x--) { arr[x][0] = arr[x-1][0]; } for (int y = 0; y < C - 1; y++) { arr[0][y] = arr[0][y+1]; } for (int x = 0; x < top; x++) { arr[x][C-1] = arr[x+1][C-1]; } for (int y = C - 1; y > 1; y--) { arr[top][y] = arr[top][y-1]; } arr[top][1] = 0; // 아래쪽 공기청정기는 시계 방향 int bottom = airCleanerRows.get(1); for (int x = bottom + 1; x < R - 1; x++) { arr[x][0] = arr[x+1][0]; } for (int y = 0; y < C - 1; y++) { arr[R-1][y] = arr[R-1][y+1]; } for (int x = R - 1; x > bottom; x--) { arr[x][C-1] = arr[x-1][C-1]; } for (int y = C - 1; y > 1; y--) { arr[bottom][y] = arr[bottom][y-1]; } arr[bottom][1] = 0; } static int calculateSum() { int sum = 2; for (int x = 0; x < R; x++) { for (int y = 0; y < C; y++) { sum += arr[x][y]; } } return sum; } }
'알고리즘 문제 > Samsung' 카테고리의 다른 글
백준 17143번. 낚시왕 (Java) (3) | 2020.10.14 |
---|---|
백준 19237번. 어른 상어 (Java) (0) | 2020.10.14 |
백준 19238번. 스타트 택시 (Java) (0) | 2020.10.12 |
백준 14891번. 톱니바퀴 (Java, Python) (0) | 2019.01.01 |
백준 14890번. 경사로 (Java, Python) (0) | 2018.12.30 |