- 백준 문제 : https://www.acmicpc.net/problem/10211
- leetCode 문제 : https://leetcode.com/problems/maximum-subarray/description/
10211번: Maximum Subarray
크기 N인 정수형 배열 X가 있을 때, X의 부분 배열(X의 연속한 일부분) 중 각 원소의 합이 가장 큰 부분 배열을 찾는 Maximum subarray problem(최대 부분배열 문제)은 컴퓨터 과학에서 매우 잘 알려져 있
www.acmicpc.net
Maximum Subarray - LeetCode
Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.
leetcode.com
두 문제의 요지는 최대부분배열 Maximum Subarray)합을 구하는 것이다.
(개인적으로 성능이나 테스트 케이스가 정확히 나오는 leet code를 선호하는 편..)
최대부분배열합이란?
→ 연속된 배열 중 합이 가장 큰 서브배열 (음수가 섞여있다)
1. brute-force solution
→ 부분배열의 시작점을 i, j라고 할때(1≤ i ≤ j ≤ n) i와 j 값을 모두 대입해보는 방법
if __name__ == "__main__":
TCNum = int(input())
for n in range(0,TCNum) :
size = int(input())
array = [int(x) for x in input().split()]
max = array[0]
# 이중 포문을 이용해 모든 가능성을 비교한다.
for i in range(0,size):
sum = 0
for j in range(i,size):
sum += array[j]
if max <= sum :
max = sum
print(max)
해당 코드 실행시간은 배열 size * size 따라서 O(n²)이라고 볼 수 있다.
실행결과 :

백준 알고리즘에서는 통과했지만 leet code에선 201번째 테스트케이스에서 무려 타임 리밋이 나버렸다..;;
2. divide-and-conquer solution
→ 배열을 왼쪽 오른쪽으로 나누어 두 부분에서 최대배열 합을 찾고, 두 부분을 관통하는 부분에서 최대배열 합을 찾는 방식

def findMax(arr, low, high):
if low == high:
return arr[low]
else:
mid = int((low + high)/2)
Lsum = findMax(arr,low,mid)
Rsum = findMax(arr,mid+1,high)
Msum = findMidMax(arr,low,mid,high)
return max(Lsum,Rsum,Msum)
def findMidMax(arr,low,mid,high):
Lsum = float("-inf")
Rsum = float("-inf")
sum = 0
for i in range(mid,low-1,-1):
sum = sum + arr[i]
if sum > Lsum:
Lsum = sum
sum = 0
for j in range(mid+1,high+1):
sum = sum + arr[j]
if sum > Rsum:
Rsum = sum
return Lsum+Rsum
if __name__ == "__main__":
TCNum = int(input())
for n in range(0,TCNum) :
size = int(input())
array = [int(x) for x in input().split()]
print(findMax(array, 0, size-1))
merge sort와 비슷한 방식으로 실행시간은 O(nlogn) 이라고 볼 수 있다.
실행결과 :

brute force처럼 런타임에러는 나지 않지만 썩 성능이 좋아보이지도 않는다 ㅋㅋ..
그도 그럴것이 이 문제 해결법 중에 선형 O(n)으로 푸는 방법이 있다는데 ..
3. 추후에 정리...
+) 결과 비교시

백준에서 두 결과 비교시 시간복잡도가 O(n²)과 O(nlogn) 풀이법의 시간이 현저히 차이나는 것을 볼 수 있다.
'알고리즘 > 코드' 카테고리의 다른 글
[코딩테스트 고득점 Kit] 해시 3 - 전화번호 목록 (0) | 2023.01.04 |
---|---|
[코딩테스트 고득점 Kit] 해시 2 - 폰켓몬 (0) | 2023.01.03 |
2020 KAKAO BLIND RECRUITMENT 괄호 변환 Python (0) | 2020.11.28 |
코딩테스트 고득점 Kit [정렬] - K번째 수 (python) (1) | 2020.05.11 |
leetcode 1week (0) | 2020.05.03 |
댓글