|
| 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