본문으로 바로가기

[백준 17141] 연구소 2 -JAVA //le_effort//

category 알고리즘 2020. 3. 23. 15:38

연구소 2

 

시간 제한메모리 제한제출정답맞은 사람정답 비율
1 초512 MB197188860543.369%

문제

인체에 치명적인 바이러스를 연구하던 연구소에 승원이가 침입했고, 바이러스를 유출하려고 한다. 승원이는 연구소의 특정 위치에 바이러스 M개를 놓을 것이고, 승원이의 신호와 동시에 바이러스는 퍼지게 된다.

연구소는 크기가 N×N인 정사각형으로 나타낼 수 있으며, 정사각형은 1×1 크기의 정사각형으로 나누어져 있다. 연구소는 빈 칸, 벽으로 이루어져 있으며, 벽은 칸 하나를 가득 차지한다.

일부 빈 칸은 바이러스를 놓을 수 있는 칸이다. 바이러스는 상하좌우로 인접한 모든 빈 칸으로 동시에 복제되며, 1초가 걸린다.

예를 들어, 아래와 같이 연구소가 생긴 경우를 살펴보자. 0은 빈 칸, 1은 벽, 2는 바이러스를 놓을 수 있는 칸이다.

M = 3이고, 바이러스를 아래와 같이 놓은 경우 6초면 모든 칸에 바이러스를 퍼뜨릴 수 있다. 벽은 -, 바이러스를 놓은 위치는 0, 빈 칸은 바이러스가 퍼지는 시간으로 표시했다.

시간이 최소가 되는 방법은 아래와 같고, 5초만에 모든 칸에 바이러스를 퍼뜨릴 수 있다.

연구소의 상태가 주어졌을 때, 모든 빈 칸에 바이러스를 퍼뜨리는 최소 시간을 구해보자.

입력

첫째 줄에 연구소의 크기 N(5 ≤ N ≤ 50), 놓을 수 있는 바이러스의 개수 M(1 ≤ M ≤ 10)이 주어진다.

둘째 줄부터 N개의 줄에 연구소의 상태가 주어진다. 0은 빈 칸, 1은 벽, 2는 바이러스를 놓을 수 있는 칸이다. 2의 개수는 M보다 크거나 같고, 10보다 작거나 같은 자연수이다.

출력

연구소의 모든 빈 칸에 바이러스가 있게 되는 최소 시간을 출력한다. 바이러스를 어떻게 놓아도 모든 빈 칸에 바이러스를 퍼뜨릴 수 없는 경우에는 -1을 출력한다.

예제 입력 1 복사

예제 출력 1 복사

예제 입력 2 복사

예제 출력 2 복사

예제 입력 3 복사

예제 출력 3 복사

예제 입력 4 복사

예제 출력 4 복사

예제 입력 5 복사

예제 출력 5 복사

예제 입력 6 복사

예제 출력 6 복사

예제 입력 7 복사

예제 출력 7 복사

 

풀이

사용 알고리즘 : dfs(조합)+bfs

 

class 선언

바이러스의 위치를 받을 x,y 좌표와 바이러스가 동시에 퍼지므로 큐에서 빼낸걸 기준으로 시간을 구해주기 위해 time이라는 변수도 넣어주었다.

 

ArrayList타입의 virus에는 현재 x좌표 y좌표 시간이 들어있다.

 

 

 

전체적인 방향은 조합알고리즘으로 바이러스를 뽑고 그 후 bfs를 돌리면 된다.

bfs를 돌릴 때 copy_map을 만들어 주었는데 우선 copy_map의 바이러스 놓을수 있는 위치를

일단 모두 0으로 바꿔주었다.

그 후 조합에 들어있는 부분은 2로 바꿔주면 현재 copy_map에는 m개 크기만큼의 바이러스만 있게 된다.

 

그 후 바이러스 확산을 bfs를 통해 돌린다.

조건에 맞는 부분은 2 (바이러스가 있다)로 바꿔준다.

 

bfs가 끝나고 copy_map에 0이 있다면 바이러스를 다 확산하지 못하는 것

이건 isPossible로 처리를 해주었다.

 

 

그 후 이 조건에 맞을때만 min값을 변경하고 최종적으로 min값이 변경되지 않았으면 -1을 출력

아닐경우 답을 출력하면 된다.

 

전체코드

 

 

후기

쉽게 한 번에 푼 문제.

요새 웹 공부도 병행하고 있어 알고리즘을 오랜만에 풀었는데 여지껏 알고리즘을 풀었던 것이 안까먹고 기억하고 있는것 같아 뿌듯했다.