A-013● Day 132026.05.15mediumleetcode #11neetcode150
물이 가장 많은 용기
#array#two-pointers#greedy
01
문제
· problem길이가 n인 정수 배열 height가 주어집니다. n개의 수직선이 있고, i번째 선의 끝점은 (i, 0)과 (i, height[i])입니다. 두 선이 x축과 함께 만드는 용기가 가장 많은 물을 담을 수 있도록 두 선을 찾으세요. 용기가 담을 수 있는 물의 최대량을 반환하세요. 용기를 기울일 수 없다는 점에 유의하세요.
제약
- · n == height.length
- · 2 ≤ n ≤ 10^5
- · 0 ≤ height[i] ≤ 10^4
// 지문은 본인 언어 요약 — 원문은 위 링크에서
입출력 예시
02
사전 사고
· pre-solve● 1리스트 출력→● 2선택→● 3정답 공개
- ☐두 선 사이의 물의 넓이는 어떻게 계산되나요?
- ☐다른 인덱스의 임의의 두 선을 사용할 수 있나요?
- ☐더 작은 높이를 가진 포인터를 왜 움직여야 하나요?
- ☐인접한 두 선의 높이가 같으면 어떻게 하나요?
- ☐모든 가능한 선의 쌍을 확인해야 하나요?
- ☐용기를 수평이 아닌 수직으로 배치할 수 있나요?
- ☐원본 높이 배열을 수정해야 하나요?
던질 질문에 체크하고 확인을 누르세요
// 결과는 세션 메모리만 — 새로고침하면 초기화됩니다 (반복 학습)
03
논리 구조
· logic● 1슬롯 출력→● 2슬롯별 선택→● 3정답 공개
// 각 슬롯에 들어갈 코드 한 줄을 골라 알고리즘 흐름을 합성해보세요. 코드는 안 짜지만 논리 뼈대는 직접.
step 1· 양쪽 끝에 포인터 초기화
○
l, r = 0, len(height) - 1
○
l, r = 0, len(height) // 2
○
l, r = 1, len(height) - 2
step 2· 최대 넓이 추적기 초기화
○
res = 0
○
res = float('-inf')○
res = height[0] * (len(height) - 1)
step 3· 포인터가 교차할 때까지 반복
○
while l < r:
○
while l <= r:
○
while r - l > 1:
step 4· 넓이 계산 및 최댓값 추적│ 중첩
○
res = max(res, min(height[l], height[r]) * (r - l))
○
res = max(res, height[l] * height[r] * (r - l))
○
res = max(res, (height[l] + height[r]) * (r - l))
step 5· 더 작은 높이의 포인터 이동│ 중첩
○
if height[l] < height[r]:
○
if height[l] > height[r]:
○
if l < r // 2:
step 6· 왼쪽 포인터를 안쪽으로 이동│ │ 중첩
○
l += 1
○
l -= 1
○
l += 2
step 7· 오른쪽 포인터를 안쪽으로 이동 (해당하는 경우)│ │ 중첩
○
r -= 1
○
r += 1
○
r -= 2
각 슬롯에 한 줄씩 골라보세요
// format: slot — 다른 패턴(재귀·DP 등) 은 ordering·state-first 등 별도 format. ADR-08 후속.
04
문제풀이 · 트레이스
· solve머릿속 dry-run 케이스
// 각 케이스를 머릿속으로 따라가보세요. 막히면 아래 worked example 펼침.
case 1
[1,8,6,2,5,4,8,3,7]→
49
case 2
[1,1]→
1
// UI 가 walk-through 안 함 — 학습자가 머릿속으로. 막히면 worked example 펼침.