[수업]물탱크(Greedy 문제)

Intro..

이 문제는 Greedy(탐욕) 관련 문제이다.

Greedy(탐욕) 관련해서 정리해둔 게시글이 있기 때문에 참고할 것.


문제

screen captures

screen captures

screen captures

screen captures


풀이

물은 특성상 젤낮은 구멍(높이 젤낮은)에 빠지는건 당연한 원리
=> 탱크 내부가 아무리 높이가 낮은 0이여도 젤 외곽의 구멍 높이에 따라 물이 빠지는건 너무 당연.

최외곽의 경우 젤 낮은 구멍은 위의 원리 그대로 적용 가능 -> 시작 지점.

만약 적용했으면 그 부분 물탱크는 없다고 생각하고 다음 케이스를 생각.
다음꺼도 최외곽에서 젤 낮은 구멍을..! 그이후 또 물탱크 없다고 생각하고 다음 케이스 생각.

…반복

그러다가 2가지 경우가 있음.
인접 물높이와 현재 구멍이 더 높거나, 작은경우. 이 케이스도 하면 끝

참고로 최소 물높이를 구하는것이므로 물탱크 벽 4방향에 구멍들 여러개면, 전부 확인해봐야 정확한 최소 물높이를 구할 수 있음

결론은 최외각의 젤 낮은 구멍에서 야금야금 찾아가는 방식

  • 다익스트라 알고리즘의 최소 거리 구하는것 처럼, 최소 높이를 찾아가는 형태
    이를 배열이 아닌 우선순위 큐를 활용해서 해결했음(복잡도 더 좋음)

  • 우선순위 큐는 최외곽 구멍들로만 구성이 되고, 최소 높이로 우선순위를 정해서 pop으로 사용하는 구조로 이해할 수 있다.

자세한 흐름은 아래 그림을 보고 참고

screen captures

  • 그림에서 물탱크 인접했을때 특징 2가지만 이해된다면 아래 식인 max(..,..) 가 유도 가능
  • 또한, 예시처럼 최외각의 낮은 구멍을 선택해가면서 인접의 경우를 처리하면 답을 구할 수 있따.

댓글남기기