https://www.acmicpc.net/problem/17144
문제에서 요구하는 것은 2가지. 먼지 퍼지기랑 공기 순환
1. 먼지 퍼지기
- 전체 다 파악하면서 먼지를 퍼지게 해준다.
- 주의할 점은 원래 미세먼지가 있는 곳과 미세먼지가 새로 생기는 곳을 분리하지 않으면 값이 엉킬수가 있어서 추가로 더해지는 배열을 만들어서 마지막에 합쳐준다.
- 미세먼지가 퍼지거나 배열을 마지막메 합쳐주고, 새로 만들어주는 과정에서 절대절대 공기청정기를 잘 생각해줘야한다. 구현방법에 따라 마지막에 +2 해줘서 구할 수도 있지만, 일단 나는 미연에 방지하였다.
2. 공기 순환
- 위에는 반시계방향, 아래는 시계방향으로 돌려주면 된다!
- 공기 청정기 방향은 변하지 않는 것도 주의!! 공기청정기가 1열에 고정되어있어서 구현이 한결 쉬웠다!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 | import java.io.*; import java.util.*; /** */ public class Main { static int R, C, T; static int[][] dirs = { { 1, 0 }, { -1, 0 }, { 0, 1 }, { 0, -1 } }; static int[][] map, marchine, result; static boolean[][] marked; public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st; 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]; result = new int[R][C]; marchine = new int[2][2]; marked = new boolean[R][C]; int idx = 0; 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) marchine[idx++] = new int[] { i, j }; } } while (T-- > 0) { spread(); airconditioner(); map[marchine[0][0]][marchine[0][1]] = -1; map[marchine[1][0]][marchine[1][1]] = -1; } 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 airconditioner() { // 반시계방향. int[] top = marchine[0]; map[top[0]][1] = 0; // -> for (int i = 2; i < C; i++) { map[top[0]][i] = result[top[0]][i - 1]; } // ^ for (int i = top[0]; i > 0; i--) { map[i -1][C - 1] = result[i][C - 1]; } // <- for (int i = C - 2; i >= 0; i--) { map[0][i] = result[0][i + 1]; } // v for (int i = 1; i < top[0]; i++) { map[i][0] = result[i - 1][0]; } // 시계 방향 int[] bottom = marchine[1]; map[bottom[0]][1] = 0; // -> for (int i = 2; i < C; i++) { map[bottom[0]][i] = result[bottom[0]][i - 1]; } // v for (int i = bottom[0]; i < R - 1; i++) { map[i + 1][C - 1] = result[i][C - 1]; } // <- for (int i = C - 1; i > 0; i--) { map[R - 1][i - 1] = result[R - 1][i]; } // ^ for (int i = R - 1; i >= bottom[0]; i--) { map[i - 1][0] = result[i][0]; } } // << 미세먼지의 확산 >> private static void spread() { result = new int[R][C]; for (int i = 0; i < R; i++) { for (int j = 0; j < C; j++) { int cur = map[i][j]; if (cur == 0) continue; cur /= 5; int cnt = 0; for (int d = 0; d < 4; d++) { int nextR = i + dirs[d][0]; int nextC = j + dirs[d][1]; if (nextR < 0 || nextC < 0 || nextR >= R || nextC >= C) continue; if (nextR == marchine[0][0] && nextC == marchine[0][1]) continue; if (nextR == marchine[1][0] && nextC == marchine[1][1]) continue; result[nextR][nextC] += cur; cnt++; } cur = map[i][j] - map[i][j] / 5 * cnt; result[i][j] += cur; } } for (int i = 0; i < R; i++) { for (int j = 0; j < C; j++) { if (result[i][j] < 0) result[i][j] = 0; if (i == marchine[0][0] && j == marchine[0][1]) result[i][j] = -1; if (i == marchine[1][0] && j == marchine[1][1]) result[i][j] = -1; map[i][j] = result[i][j]; } } } } | cs |
반응형
'알고리즘 문제 풀이 > BOJ' 카테고리의 다른 글
[backjoon]2048(easy) (0) | 2022.04.27 |
---|---|
[backjoon]17822 원판 돌리기 java (0) | 2022.04.25 |
[backjoon]14500 테트로미노 java (0) | 2022.04.11 |
[beakjoon]7682 틱택토 java (0) | 2022.04.06 |
[backjoon] 23288 주사위 굴리기 2 java (0) | 2022.03.29 |