Skip to content

Commit 61954dc

Browse files
committed
feat: Container With Most Water 문제 풀이
1 parent a6b503f commit 61954dc

File tree

1 file changed

+72
-0
lines changed

1 file changed

+72
-0
lines changed
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
class Solution:
2+
def maxArea(self, height: List[int]) -> int:
3+
left = 0
4+
right = len(height) - 1
5+
max_area = 0
6+
7+
while left < right:
8+
min_height = min(height[left], height[right])
9+
width = right - left
10+
area = min_height * width
11+
12+
max_area = max(max_area, area)
13+
14+
if height[left] < height[right]:
15+
left += 1
16+
else:
17+
right -= 1
18+
19+
return max_area
20+
21+
22+
"""
23+
================================================================================
24+
풀이 과정
25+
================================================================================
26+
27+
[1차 시도] Brute Force로 접근하면?
28+
────────────────────────────────────────────────────────────────────────────────
29+
1. 모든 (i, j) 쌍에 대해 넓이 계산
30+
2. height = [1, 8, 6, 2, 5, 4, 8, 3, 7]
31+
- (0, 1): min(1, 8) × 1 = 1
32+
- (0, 2): min(1, 6) × 2 = 2
33+
- (0, 8): min(1, 7) × 8 = 8
34+
- (1, 8): min(8, 7) × 7 = 49 ← 최대
35+
... 모든 쌍을 확인해야 함
36+
37+
3. 시간복잡도: O(n²) - 시간 초과!
38+
4. 더 효율적인 방법이 필요함 → Two Pointer로 접근
39+
40+
────────────────────────────────────────────────────────────────────────────────
41+
[2차 시도] Two Pointer (양끝에서 좁히기)
42+
────────────────────────────────────────────────────────────────────────────────
43+
5. 핵심 아이디어:
44+
- 넓이 = min(height[left], height[right]) × (right - left)
45+
- 폭(width)은 양끝에서 시작할 때 최대
46+
- 포인터를 안쪽으로 이동하면 폭은 무조건 줄어듦
47+
- 따라서 높이가 커져야 넓이가 커질 가능성이 있음
48+
49+
6. 왜 작은 쪽을 이동하는가?
50+
- 작은 쪽이 높이의 병목 (min이 작은 쪽에 의해 결정됨)
51+
- 큰 쪽을 이동하면? → 높이는 그대로거나 작아짐, 폭은 줄어듦 → 손해만
52+
- 작은 쪽을 이동하면? → 높이가 커질 가능성 있음 → 이득 가능성
53+
54+
7. 동작 예시: height = [1, 8, 6, 2, 5, 4, 8, 3, 7]
55+
56+
Step 1: L=0, R=8
57+
min(1, 7) × 8 = 8
58+
height[L]=1 < height[R]=7 → L 이동
59+
60+
Step 2: L=1, R=8
61+
min(8, 7) × 7 = 49 ← 최대!
62+
height[L]=8 > height[R]=7 → R 이동
63+
64+
Step 3: L=1, R=7
65+
min(8, 3) × 6 = 18
66+
height[L]=8 > height[R]=3 → R 이동
67+
68+
... L과 R이 만날 때까지 반복
69+
70+
8. 시간복잡도: O(n) - 한 번만 순회
71+
9. 공간복잡도: O(1) - 추가 공간 없음
72+
"""

0 commit comments

Comments
 (0)