Skip to content

Commit 9f8ceb2

Browse files
committed
feat: maximum-subarray 풀이 추가
1 parent 2db0603 commit 9f8ceb2

File tree

1 file changed

+63
-0
lines changed

1 file changed

+63
-0
lines changed

maximum-subarray/unpo88.py

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
class Solution:
2+
def maxSubArray(self, nums: List[int]) -> int:
3+
current_sum = nums[0]
4+
max_sum = nums[0]
5+
6+
for i in range(1, len(nums)):
7+
# 현재 값부터 새로 시작 vs 이전 합에 추가
8+
current_sum = max(nums[i], current_sum + nums[i])
9+
max_sum = max(max_sum, current_sum)
10+
11+
return max_sum
12+
13+
14+
"""
15+
================================================================================
16+
풀이 과정
17+
================================================================================
18+
19+
1. 부분 배열 중 가장 큰 합을 찾아야 하는데 어떻게 접근하지?
20+
2. Sliding Window? → 음수/양수가 섞여있어서 윈도우 크기를 언제 조절할지 불명확
21+
3. 모든 부분배열을 확인? → O(n²)이라 비효율적
22+
4. 각 위치에서 "현재까지의 최대 부분합"을 추적하면 되지 않을까?
23+
24+
25+
[1차 시도] Dynamic Programming
26+
────────────────────────────────────────────────────────────────────────────────
27+
5. 핵심 아이디어: 각 위치에서 "이 위치를 끝으로 하는" 최대 부분배열의 합 추적
28+
6. current_sum = "현재 위치를 끝으로 하는 최대 부분합"
29+
7. 매 위치에서 선택: 이전 합에 추가 vs 여기서 새로 시작
30+
31+
current_sum = nums[0] # 현재 위치까지의 최대 부분합
32+
max_sum = nums[0] # 전체 최댓값
33+
34+
for i in range(1, len(nums)):
35+
# 이전 합이 양수면 계속, 음수면 버리고 새로 시작
36+
current_sum = max(nums[i], current_sum + nums[i])
37+
max_sum = max(max_sum, current_sum)
38+
39+
return max_sum
40+
41+
8. Example: nums = [-2, 1, -3, 4, -1, 2, 1, -5, 4]
42+
43+
i=0: current=-2, max=-2
44+
i=1: max(1, -2+1=-1) = 1 (새로 시작), max=1
45+
i=2: max(-3, 1-3=-2) = -2 (이어감), max=1
46+
i=3: max(4, -2+4=2) = 4 (새로 시작), max=4
47+
i=4: max(-1, 4-1=3) = 3 (이어감), max=4
48+
i=5: max(2, 3+2=5) = 5 (이어감), max=5
49+
i=6: max(1, 5+1=6) = 6 (이어감), max=6 ✓
50+
i=7: max(-5, 6-5=1) = 1 (이어감), max=6
51+
i=8: max(4, 1+4=5) = 5 (이어감), max=6
52+
53+
결과: [4, -1, 2, 1] = 6
54+
55+
9. 왜 작동하는가?
56+
- 모든 부분배열은 어딘가에서 끝남
57+
- 각 위치에서 "여기를 끝으로 하는 최댓값" 추적
58+
- 이전 합이 음수면 버리는 게 이득 (Greedy한 선택)
59+
- 이전 합이 양수면 현재 값이 음수여도 계속 (예: 4 + (-1) = 3)
60+
61+
10. 시간 복잡도: O(n) - 배열을 한 번만 순회
62+
11. 공간 복잡도: O(1) - 변수 2개만 사용
63+
"""

0 commit comments

Comments
 (0)