Problem : 백조의 호수
유형 : BFS
문제 설명
두 마리의 백조가 호수에서 살고 있었다. 그렇지만 두 마리는 호수를 덮고 있는 빙판으로 만나지 못한다.
호수는 가로로 R, 세로로 C만큼의 직사각형 모양이다. 어떤 칸은 얼음으로 덮여있다.
호수는 차례로 녹는데, 매일 물 공간과 접촉한 모든 빙판 공간은 녹는다.
두 개의 공간이 접촉하려면 가로나 세로로 닿아 있는 것만 (대각선은 고려하지 않는다) 생각한다.
백조는 오직 물 공간에서 세로나 가로로만(대각선은 제외한다) 움직일 수 있다.
며칠이 지나야 백조들이 만날 수 있는 지 계산하는 프로그램을 작성한다.
예제 입력
1 |
|
예제 출력
1 |
|
해결 전략
맵이 어마무시하게 크다.
1500 x 1500
이다.
일반적인 BFS로 접근할시1500 ^ 3
으로 TLE 가 발생한다.백조 한마리를 최대한 움직인다. 이 백조는 A백조라고 하겠다.
그리고 만약 다른 백조(B백조)를 만나지 못했다면, 현재 얼음벽 바로 옆에 서있을 것이다.
A백조가 이미 지나온길은 절대 정답이 되지 못한다.
그렇다면 A백조는 지나온길을 다시 갈 필요가 없으므로, 다음 시작 위치를 이동을 막은 얼음 좌표부터 시작한다.
이를 위해서 큐를 4개를 사용했다.
좌표 저장을 위해 굳이 큐를 쓸 필요가 없다.
다음 진행 좌표를 담기 위해 큐를 사용하면 pop 작업이 추가되어 복잡도가 늘어난다..라고 생각했는데 별차이가 없다.
이전 코드의 가독성이 너무 나빠 05-06
기준 수정.
- 백조를 움직일 BFS를 위한 큐
- 다음에 얼음이 녹은 후 백조가 BFS를 시작할 위치를 담은 벡터
- 현재 물인 위치를 담은 큐
- 다음에 녹을 얼음의 위치를 담은 벡터
주의할 점
- 맵이
1500 x 1500
이다. - 백조가 위치하고 있는곳도 물 이라고 생각해야한다.
이거 때문에 맞왜틀함
- 백조 두마리를 동시에 움직이는 풀이도 생각 해보았으나, 고려할 부분이 너무 많아서 포기했다.
풀이
A 백조의 위치와, 지도 정보를 입력 받아 처리한다.
- A백조란, 첫번쨰로 찾는 백조를 뜻한다. 어느 백조를 먼저 찾는지는 중요치 않다.
A백조
를B백조
를 만날때까지 움직여 나갈것이다.B백조
가 있는 위치도 물로 생각하고, 주위의 얼음을 녹여 나가야 한다.
- 현재 물의 좌표들을 입력받는다.
백조를 움직인다.
- A백조를
BFS
를 통해 움직여본다. - 만약 B백조를 만나지 못했다면, 얼음을 녹이고 다시 시도해야한다.
- 지나온길을 다시 갈필요가 없다.
- 백조의 다음 시작위치를 막혀서 가지 못한 좌표부터 시작한다.
얼음을 녹인다.
- 물에 맞닿은 얼음의 위치를 찾으면, 해당 얼음을 녹인다.
- 과거 얼음이었으나, 물로 바뀐 좌표부터 시작한다.
코드
05-06
수정
1 |
|
피드백
시간 복잡도 계산하는 연습을 좀 더 해야겠다.
문제 잘 읽는것이 진~짜 중요하다.
맞은사람 랭크 10위안에 든건 처음이다.짤림