문제 : www.acmicpc.net/problem/17144
구현문제.
먼지가 이동한 뒤의 모습을 저장할 배열 (let, newArr)을 하나 만든다. newArr은 0으로 초기화한다.
먼저 먼지의 확산된 모습을 newArr 배열에 담는다.
집 배열을 탐색하면서 해당 칸(let, (x,y))의 값이
-1 이면 공기청정기 이므로 나중에 공기청정기 확산할 때를 대비해 해당 좌표를 cleaners 배열에 담아두고 다음을 탐색한다.
0 이면 먼지가 없다는 뜻이므로 다음을 탐색한다
양수값이면 먼지가 확산시킨다. 상하좌우로 이동한 좌표값을 (nx, ny)라 하자. (nx, ny)가 RxC 배열칸을 넘어가지 않고 집에서 nx, ny 좌표값이 -1이 아닌경우(공기청정기) 해당 칸으로 먼지가 확산될 수 있으므로 newArr[nx][ny]에 탐색중인 칸의 먼지 양 / 5를 더해준다. 이 때, 이미 다른 먼지의 확산으로 newArr[nx][ny]에 먼지가 이미 있을 수 있으므로 덮어쓰기하면 안되고 더해줘야한다. newArr[x][y]에는 기존 먼지 양에 확산된 먼지 양을 뺀 값을 더해준다.
먼지의 확산이 끝났으면 공기청정기(cleaners)에 의해먼지를 이동시킨다.
이동시키고자 하는 칸의 좌표 (x, y), 방향을 변수로 두고 먼지를 이동시킨다.
이동시키고자 하는 다음 좌표(nx, ny)가
공기청정기(-1)인 경우 이동을 종료한다.
칸을 벗어나는 경우 방향을 변경한다. (시계방향 : 오른쪽 -> 아래 -> 왼쪽 -> 위 / 시계반대방향 : 오른쪽 -> 위 -> 왼쪽 -> 아래)
이를 T 번 반복하고 난 뒤의 집 칸의 먼지 총 양을 구하면 정답이된다.
시간복잡도는 O(RCT).
구현문제는 코드를 보는게 더 이해가 잘되기 때문에 코드 참조를 권한다.
'알고리즘 문제 > BOJ' 카테고리의 다른 글
[BOJ][20528] 끝말잇기 (0) | 2021.01.01 |
---|---|
[BOJ][17143] 낚시왕 (0) | 2020.11.15 |
[BOJ][16235] 나무 재테크 (0) | 2020.11.07 |
[BOJ][14890] 경사로 (0) | 2020.11.06 |
[BOJ][1346] 구슬 탈출 2 (0) | 2020.11.01 |
댓글