반응형
250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- oracleapex
- 개인프로필스튜디오창업
- 렌탈스튜디오창업
- 채널계
- SQL
- 모놀리식
- 계정계
- Homebrew
- 오라클
- 코딩테스트
- 의사결정나무모형
- 코어뱅킹
- fastapi
- 컴퓨터공학학사취득
- jdk
- 맥북
- jdk17
- Pass By Value
- 학점은행제무료강의
- 은행IT
- it자격증
- MSA
- DB
- 맥북셋팅
- 맥북환경설정
- python
- 디렉토리계층구조
- 프로그래머스
- union
- 학점은행제
Archives
- Today
- Total
개발머해니
[파이썬] 투자 귀재 규식이 Ⅱ 본문
728x90
반응형
실습 설명
규식이는 친구들 사이에서 투자의 귀재로 알려져 있습니다. 페이수북과 인수타그램에 자신의 성과를 과시하기 때문인데요. 사실 규식이가 그 정도의 실력자는 아닙니다. 성과가 좋을 때에만 SNS에 공유해서 그렇게 비춰질 뿐이죠.
계속해서 멋진 모습을 보여주기 위해, 특정 기간 중 수익이 가장 큰 구간을 찾아내는 함수 sublist_max()를 작성해 보려고 합니다.
Divide and Conquer 방식으로 풀어볼 텐데요. 시간 복잡도는 O(nlgn)이 되어야 합니다.
함수 설명
이번 sublist_max() 함수는 3개의 파라미터를 받습니다.
- profits: 며칠 동안의 수익이 담겨 있는 리스트
- start: 살펴볼 구간의 시작 인덱스
- end: 살펴볼 구간의 끝 인덱스
sublist_max()는 profits의 start부터 end까지 구간에서 가능한 가장 큰 수익을 리턴합니다.
합병 정렬을 구현할 때 merge_sort() 함수를 깔끔하게 작성하기 위해 추가로 merge() 함수를 작성했던 것 기억 나시나요? 마찬가지로 퀵 정렬을 구현할 때 quicksort() 함수에 추가로 partition() 함수를 작성했습니다. 이번에도 sublist_max() 함수에 추가로 새로운 함수를 작성하면 도움이 되실 겁니다.
실습 결과
def max_crossing_sum(profits, start, end):
mid = (start + end) // 2 # 중간 인덱스
'''
왼쪽에서의 가장 큰 수익 계산
인덱스 mid부터 인덱스 0까지 범위를 넓혀가며 최대 수익을 찾는다
'''
left_sum = 0 # 왼쪽 누적 수익
left_max = profits[mid] # 왼쪽 최고 수익; 왼쪽 반 중 가장 오른쪽 값으로 초기화
for i in range(mid, start - 1, -1):
left_sum += profits[i]
left_max = max(left_max, left_sum)
'''
오른쪽에서의 가장 큰 수익 계산
인덱스 mid+1부터 인덱스 end까지 범위를 넓혀가며 최대 수익을 찾는다
'''
right_sum = 0 # 오른쪽 누적 수익
right_max = profits[mid + 1] # 오른쪽 최고 수익; 오른쪽 반 중 가장 왼쪽 값으로 초기화
for i in range(mid + 1, end + 1):
right_sum += profits[i]
right_max = max(right_max, right_sum)
return left_max + right_max
def sublist_max(profits, start, end):
# 범위에 하나의 항목밖에 없으면, 그 항목을 리턴한다
if start == end:
return profits[start]
# 중간 인덱스
mid = (start + end) // 2
# 상황별로 최대 수익을 구한다
max_left = sublist_max(profits, start, mid)
max_right = sublist_max(profits, mid + 1, end)
max_cross = max_crossing_sum(profits, start, end)
# 위 세 경우 중 가장 큰 결괏값을 리턴한다
return max(max_left, max_right, max_cross)
# 테스트 코드
list1 = [-2, -3, 4, -1, -2, 1, 5, -3]
print(sublist_max(list1, 0, len(list1) - 1))
list2 = [4, 7, -6, 9, 2, 6, -5, 7, 3, 1, -1, -7, 2]
print(sublist_max(list2, 0, len(list2) - 1))
list3 = [9, -8, 0, -7, 8, -6, -3, -8, 9, 2, 8, 3, -5, 1, -7, -1, 10, -1, -9, -5]
print(sublist_max(list3, 0, len(list3) - 1))
list4 = [-9, -8, -8, 6, -4, 6, -2, -3, -10, -8, -9, -9, 6, 2, 8, -1, -1]
print(sublist_max(list4, 0, len(list4) - 1))
7
28
22
16
시간 복잡도
728x90
반응형
'알고리즘' 카테고리의 다른 글
[파이썬] 삼송전자 주식 분석 (0) | 2023.09.30 |
---|---|
[파이썬] 투자 귀재 규식이 Ⅲ (0) | 2023.09.30 |
[파이썬] 중복되는 항목 찾기 Ⅰ (0) | 2023.09.30 |
[파이썬] 빠르게 산 오르기 (0) | 2023.09.30 |
[파이썬] 거듭 제곱 빠르게 계산하기 (0) | 2023.09.30 |