-
https://www.acmicpc.net/problem/18405
18405번: 경쟁적 전염
첫째 줄에 자연수 N, K가 공백을 기준으로 구분되어 주어진다. (1 ≤ N ≤ 200, 1 ≤ K ≤ 1,000) 둘째 줄부터 N개의 줄에 걸쳐서 시험관의 정보가 주어진다. 각 행은 N개의 원소로 구성되며, 해당 위치
www.acmicpc.net
https://github.com/JUNGSOONIL/JAVA/blob/main/BAEKJOON%2018405
GitHub - JUNGSOONIL/JAVA: JAVA 소스 코드
JAVA 소스 코드. Contribute to JUNGSOONIL/JAVA development by creating an account on GitHub.
github.com
해당 문제는 N*N크기의 map가 주어지고 바이러스를 퍼트리는데 S초 후 특정 위치의 값을 출력하는 문제다.
조건
바이러스는 작은 바이러스부터 퍼트리며 상하좌우로 똑같은 번호로 퍼트림
이미 바이러스가 있으면 해당 공간은 더이성 바이러스가 퍼지지 못함
처음에 문제를 보고는 시뮬처럼 풀면되겠다고 생각했고, 입력과 동시에 우선순위 큐에 바이러스를 담고,
무한 반복문을 돌려서 bfs를 통해 바이러스를 퍼트리고
시간을 증가시키고 시간이 같으면 멈추고 그렇지 않으면 이번에는 map를 체크해서
바이러스를 다시 큐에담는 방식으로 문제를 풀었더니 시간 초과가 발생했고, 이런저런 작업을 하다가
그냥 체크할필요없이 bfs하나만 돌리면 되겠다 생각해서 그렇게 해결했다.
먼저 우선순위큐에 넣을 데이터 형식으로 좌표값과, 바이러스 번호, 시간을 입력받고,
정렬에 대해서는 람다식으로 시간이 같으면 번호가 작은 순으로, 시간이 다르면 작은 시간으로 정렬하도록 하였고,
bfs를 돌면서 큐에서 뺀 거의 시간이 원하는 시간과 같으면 bfs를 멈추도록 했고
그렇지 않으면 이제 4방을 탐색해서 범위에 안 벗어나고 바이러스가 아니면 퍼트림과 동시에
큐에 넣어주는데 이때 시간을 1씩 증가시켜서 넣는 방식으로 문제를 해결했다.
728x90'알고리즘 > Baekjoon' 카테고리의 다른 글
Baekjoon 2589 보물섬 JAVA (0) 2021.12.15 Baekjoon 12761 돌다리 JAVA (0) 2021.12.13 Baekjoon 2470 두 용액 JAVA (0) 2021.12.11 Baekjoon 14425 문자열 집합 JAVA (0) 2021.12.09 Baekjoon 16948 데스 나이트 JAVA (0) 2021.12.08 댓글