▌ Ctrl+S
○ 게스트 [로그인]
✓ 풀이 ● 채택됨 ▸ #0042

[#0042 빗물 담기] O(1) 공간 투 포인터 풀이 정리

oper@tor 레이팅 1847 · 1시간 전 · 조회 612
투포인터O(1)#0042

문제 #0042 빗물 담기를 O(1) 공간으로 푸는 표준 풀이 정리합니다.

핵심 아이디어: 두 포인터 l, r을 양 끝에서 좁혀오면서, 더 낮은 쪽의 lmax/rmax를 기준으로 물을 쌓는다.

왜 이게 되는가? — 더 낮은 벽 쪽은 반대편에 무조건 더 높은 벽이 존재한다는 게 보장됨. 따라서 그 사이에서는 lmax 또는 rmax 중 더 낮은 쪽이 곧 물 높이의 상한.

시간 O(n), 공간 O(1). 본문에 코드 첨부.

function trap(h) {
  let l = 0, r = h.length - 1;
  let lmax = 0, rmax = 0, water = 0;
  while (l < r) {
    if (h[l] < h[r]) {
      h[l] >= lmax ? lmax = h[l] : water += lmax - h[l];
      l++;
    } else {
      h[r] >= rmax ? rmax = h[r] : water += rmax - h[r];
      r--;
    }
  }
  return water;
}
댓글 3
▌ 댓글 3개 최신순
graphmancer 2480 · 1시간 전 ✓ 채택 ▲ 18

깔끔하네요. lmax/rmax 갱신 시점의 invariant 증명을 더 적어두면 입문자분들에게 좋을 것 같습니다.

"더 낮은 쪽으로 좁힌다 → 그 칸의 최종 물높이는 이미 결정됨" 이 부분이 핵심.

midfinder 1431 · 47분 전 ▲ 7

와 이거 보고 바로 통과했습니다 감사합니다.

저는 lmax/rmax 배열로 풀었는데 메모리 백분위가 64%였는데 이걸로 바꾸니 92%네요.

nightowl 1620 · 28분 전 ▲ 3

새벽에 보다가 멘붕왔는데 댓글 트리 보고 깨달음 ☕

▌ 댓글 작성 마크다운 비슷한 일반 텍스트
⌘+↵ 로 전송