-
https://www.acmicpc.net/problem/17144
17144번: 미세먼지 안녕!
미세먼지를 제거하기 위해 구사과는 공기청정기를 설치하려고 한다. 공기청정기의 성능을 테스트하기 위해 구사과는 집을 크기가 R×C인 격자판으로 나타냈고, 1×1 크기의 칸으로 나눴다. 구사
www.acmicpc.net
https://github.com/JUNGSOONIL/JAVA/blob/main/BAEKJOON%2017144
GitHub - JUNGSOONIL/JAVA: JAVA 소스 코드
JAVA 소스 코드. Contribute to JUNGSOONIL/JAVA development by creating an account on GitHub.
github.com
해당 문제는 미세먼지의 위치 값과 공기청정기의 위치가 주어졌을 때 아래 동작을 진행 후 총 미세먼지
값을 구하는 문제다.
미세먼지가 확산된다. 확산은 미세먼지가 있는 모든 칸에서 동시에 일어난다.
(r, c)에 있는 미세먼지는 인접한 네 방향으로 확산된다.
인접한 방향에 공기청정기가 있거나, 칸이 없으면 그 방향으로는 확산이 일어나지 않는다.
확산되는 양은 Ar,c/5이고 소수점은 버린다.
(r, c)에 남은 미세먼지의 양은 Ar,c - (Ar,c/5)×(확산된 방향의 개수) 이다.
공기청정기가 작동한다.
공기청정기에서는 바람이 나온다.
위쪽 공기청정기의 바람은 반시계 방향으로 순환하고, 아래쪽 공기청정기의 바람은 시계방향으로 순환한다.
바람이 불면 미세먼지가 바람의 방향대로 모두 한 칸씩 이동한다.
공기청정기에서 부는 바람은 미세먼지가 없는 바람이고, 공기청정기로 들어간 미세먼지는 모두 정화된다.
해당 문제는 BFS를 사용하였고 먼저 값을 입력받으면서 젤 아래 있는 공기청정기의 위치를 입력해 주었다.
이후 while 문을 통해 시간이 끝날 때까지 반복을 하며 아래 순서로 진행했다.
1. bfs를 통해 미세먼지 위치 찾아서 q에 담고 퍼트리기 이때 퍼트리면 근처 값에 영향을 주기 때문에
새로운 배열을 하나 두어 진행.
2. 공기청정기를 이용해 공기를 순환시킨다 즉 이때 아래 공기청정기 먼저 실시하며,
각각의 방향을 따로 배열을 통해 지정해 주었다.
해당 문제 방향과 반대로 진행했기 때문에 공기청정기 범위를 넘어가는 경우까지 체크해 주었다.
이후 AIRY 값을 -1 감소시켜 다음 공기청정기를 진행하고 이때도 마찬가지로 아래로 내려가는 부분에서
공기 청정기 범위를 넘어가는 경우를 체크하여 주었다.
추가적으로 새로운 배열에 값을 저장할 때 공기 청정기의 위치를 따로 지정해 주어야 한다.
3. 위의 동작 완료 후 AIRY 값을 1 증가시킨다 다음 반복에서도 아래부터 시작하기 때문
4. 반복문을 돌면서 기존 배열에 새로운 배열 값을 복사하고 새로운 배열은 초기화해준다.
5. 시간이 끝날 때까지 위의 내용을 반복한다.
6. 새로운 배열에 저장된 내용의 값을 더해주는데 이때 공기청정기 값을 생각해서 더해준다.
728x90'알고리즘 > Baekjoon' 카테고리의 다른 글
Baekjoon 2193 이친수 JAVA (0) 2021.11.13 Baekjoon 11404 플로이드 JAVA (0) 2021.11.13 Baekjoon 10451 순열 사이클 JAVA (0) 2021.11.12 Baekjoon 1786 찾기 JAVA (0) 2021.11.12 Baekjoon 12015 가장 긴 증가하는 부분 수열 2 JAVA (0) 2021.11.12 댓글