Problem : 연구소 3
유형 : 구현, BFS
문제 해석
- 모든 빈 칸에 바이러스를 퍼뜨리는 최소 시간을 구하라
문제 재해석 (7)
- 바이러스 목록 중 활성화 할 바이러스 몇개를 뽑는다.
- 활성화된 바이러스는 1초마다 4방향으로 퍼져나간다
- 벽인 경우 바이러스가 퍼져나가지 못한다.
- 활성화 되지 않은 바이러스는 활성화된 바이러스와 닿으면 활성화 된다.
- 빈칸은 활성화된 바이러스와 닿으면 활성화된 바이러스가 있는곳으로 바뀐다.
해결 전략 (8)
- 제한시간이 0.25초이다
- 연구소를 전부 순회하여 바이러스 분포 상태를 확인하지 않는다.
- 빈 공간의 개수를 미리 세어 놓고, 남은 빈공간의 개수만 확인한다.
- 활성화할 바이러스를 뽑는
조합
을 만든다. - 활성화된 바이러스를
BFS
를 통해 퍼뜨린다.
설계, 구현 (17)
비트 마스킹
을 이용해 활성화할 바이러스 조합을 만든다.- 남은 빈 공간을 확인한다.
- 모두 바이러스를 채웠다면, 시간을 재보고
BFS
를 끝낸다. - 아직 빈 공간이 남아 있다면 같은 시간대의
BFS
를 묶어 진행한다. - 시간이 한번도 갱신 되지 않았다면, 모든 빈칸에 바이러스를 퍼뜨리는 것이 실패한 것이다.
주의할 점
- 빈 칸에 바이러스를 다 뿌려보는 것이다.
- 비 활성화 상태의 바이러스는 빈칸이 아니다.
- 시간마다 동시에 바이러스가 퍼져나간다.
디버깅 (30)
- 빈 칸을 바이러스로 채우는 것인데, 활성화까지 시키는 것으로 잘못 읽었다.
- 모든 빈칸을 전부 바이러스로 메꾼 경우, 종료 시키는 분기문의 위치를 잘못 놓았었다.
코드
1 |
|
피드백
- 완벽하게 문제를 이해했다고 생각해도 아닌 경우가 많다.
- 예제도 대충 보고 넘기지 말고 꼼꼼히 보고 가자.
- 문제에서 요구하는 것을 한 줄로 정확하게 정리하는 연습을 하자.