최's 먹공로그
BOJ17144_미세먼지 안녕! 본문
https://www.acmicpc.net/problem/17144
문제요약
1. 공기청정기는 항상 왼쪽 열에 설치 , 크기는 두 행을 차지(공기청정기가 두개)
1초동안 일어나는 일
1. 미세먼지가 확산 , 확산은 모든 칸에서 동시에 발생함
(1) 미세먼지는 인접한 네 방향으로 확산
(2) 인접한 방향에 공기청정기가 있거나 , 칸이 없으면 확산 못함
(3) 확산되는 양은 Ar,c / 5 소수점은 버림
(4) (r,c)에 남은 미세먼지 양은 Ar,c - (Ar,c / 5) * 확산된 방향의 개수
2. 공기청정기 작동
(1) 위쪽 공기청정기의 바람은 반시계방향으로 순환 , 아래쪽 공기청정기의 바람은 시계방향으로 순환
(2) 바람이 불면 미세먼지가 바람의 방향대로 모두 한 칸씩 이동
(3) 공기청정기로 들어간 미세먼지는 모두 정화
(4) 공기청정기에서 나온 바람은 미세먼지 = 0
출력
T초가 지난 후 map에 남은 미세먼지를 총 합한 양
문제issue
1. 미세먼지는 동시에 확산됨!!
2. 공기청정기에 의해 움직이는 미세먼지를 q 구현 말고 더 빠른 방법 생각해봐야함
해결흐름
1. map에 입력 시 공기청정기의 위치를 저장 해둔다.
2. 미세먼지가 먼저 확산된다.
(1) map을 돌면서 미세먼지 크기가 5 이상인 곳의 위치와 그때의 크기를 저장해둔다. (5로 나눴을 때 몫을 사용하기 때문 , 미세먼지는 동시에 확산되기 때문)
(2) 처음 미세먼지 위치에서 사방을 봐서 범위 안이고 공기청정기가 아니면 확산 시킨다.
(3) 처음 미세먼지 위치의 값을 갱신한다.
3. 공기청정기를 가동 시킨다.
(1) 큐를 이용하여 구현하였다.
(2) 시간이 아슬아슬하여 다른 방법도 생각해보면 좋을듯 하다.
4. map안의 값이 0보다 큰 곳의 값만 합하여 출력한다.
소스코드
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 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedList; import java.util.List; import java.util.Queue; import java.util.StringTokenizer; public class Main { static class pair{ int r; int c; int dust; public pair(int r, int c, int dust) { super(); this.r = r; this.c = c; this.dust = dust; } } static class air_cleaner{ int r; int c; public air_cleaner(int r, int c) { super(); this.r = r; this.c = c; } } private static int[] dr = {-1,0,1,0}; private static int[] dc = {0,1,0,-1}; public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine().trim(), " "); int R = Integer.parseInt(st.nextToken()); int C = Integer.parseInt(st.nextToken()); int T = Integer.parseInt(st.nextToken()); List<air_cleaner> list = new ArrayList<>(); int[][] map = new int[R][C]; for (int i = 0; i < R; i++) { st = new StringTokenizer(br.readLine().trim(), " "); for (int j = 0; j < C; j++) { int x = Integer.parseInt(st.nextToken()); map[i][j] = x; if(x == -1) { list.add(new air_cleaner(i, j)); } } } while(T > 0) { T--; // 미세먼지 확산 Queue<pair> q1 = new LinkedList<>(); for (int i = 0; i < R; i++) { for (int j = 0; j < C; j++) { if(map[i][j] >= 5) { q1.add(new pair(i, j, map[i][j])); } } } while(!q1.isEmpty()) { pair p = q1.poll(); int f_dust = p.dust; int cnt = 0; for (int i = 0; i < 4; i++) { int nr = p.r + dr[i]; int nc = p.c + dc[i]; if(nr >= 0 && nr < R && nc >= 0 && nc < C) { if(map[nr][nc] != -1) { map[nr][nc] += f_dust / 5; cnt++; } } } map[p.r][p.c] -= (f_dust / 5) * cnt; } // 공기청정기 작동 for (int i = 0; i < list.size(); i++) { int air_r = list.get(i).r; int air_c = list.get(i).c; Queue<Integer> q = new LinkedList<>(); if(i == 0) { //1 q.add(0); for (int j = air_c+1; j < C; j++) { q.add(map[air_r][j]); } for (int j = air_c+1; j < C; j++) { map[air_r][j] = q.poll(); } //2 for (int j = air_r-1; j >= 0; j--) { q.add(map[j][C-1]); } for (int j = air_r-1; j >= 0; j--) { map[j][C-1] = q.poll(); } //3 for (int j = C-2; j >= 0; j--) { q.add(map[0][j]); } for (int j = C-2; j >= 0; j--) { map[0][j] = q.poll(); } //4 for (int j = 1; j < air_r; j++) { q.add(map[j][0]); } for (int j = 1; j < air_r; j++) { map[j][0] = q.poll(); } q.clear(); } else if(i == 1) { // 1 q.add(0); for (int j = air_c+1; j < C; j++) { q.add(map[air_r][j]); } for (int j = air_c+1; j < C; j++) { map[air_r][j] = q.poll(); } // 2 for (int j = air_r+1; j < R; j++) { q.add(map[j][C-1]); } for (int j = air_r+1; j < R; j++) { map[j][C-1] = q.poll(); } // 3 for (int j = C-2; j >= 0; j--) { q.add(map[R-1][j]); } for (int j = C-2; j >= 0; j--) { map[R-1][j] = q.poll(); } // 4 for (int j = R-2; j > air_r; j--) { q.add(map[j][0]); } for (int j = R-2; j > air_r; j--) { map[j][0] = q.poll(); } q.clear(); } } } // end of while int sum = 0; for (int j = 0; j < R; j++) { for (int k = 0; k < C; k++) { if(map[j][k] > 0) { sum += map[j][k]; } } } System.out.println(sum); } // end of main } // end of class | cs |
'APS' 카테고리의 다른 글
BOJ17140_이차원배열과연산_못푼문제 (2) | 2019.06.16 |
---|---|
BOJ16234_인구 이동 (0) | 2019.06.14 |
BOJ2146_다리만들기 (0) | 2019.06.09 |
BOJ17281_야구 (0) | 2019.06.09 |
BOJ14891_톱니바퀴 (2) | 2019.06.04 |