일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- Collection
- 큐
- 프로그래머스
- Network
- solid
- Spring
- 겨울카카오인턴
- Rails
- JDBC
- 백준
- Python
- 람다 칼큘러스
- Eclipse
- Java
- functional programming
- javscript
- 자바
- 디자인패턴
- 함수형 프로그래밍
- Pattern
- tcp
- lambda calculus
- 로버트마틴
- Collections
- JavaScript
- exception
- design-pattern
- 스택
- 파이썬
- DesignPattern
Archives
- Today
- Total
개발자 노트
[백준]1912. 연속합. 본문
문제설명
연속 합 중에서 최댓값을 구하라.
접근 방법
유튜브에 본 권오흠 교수님의 설명대로, DP문제를 풀 때 optimal substructure를 나타내는 순환식을 작성해야 한다.
사고 과정은 아래 이미지에 나타나 있는대로 접근하였다.
DP문제를 풀다보니 다음을 반드시 고려해야만하고, 이를 고려하면 문제의 구조를 잘 이해하게 된다.
- 단계를 어떤 변수로 설정하였는가? (이 문제에선 i,i+1,i+2..번째 수를 단계로 보았다.)
- i번째 단계에서 최적 값에 영향을 주는 변수는 무엇인가?
- i번째 단계의 최적 값은 이전에 구한 최적값으로 어떻게 표현할 수 있는가? 즉, optimal substructure을 구하라.
- 1번째 2번째 단계의 최적 값을 푸는 건 간단하다.(이게 어렵다면 정말 어려운 문제다.)
- 앞서 고려한 두 질문에 대한 답들로 1번째 ,2번째 답을 풀어보자.
- 이제 그 답을 냈을 때 어떻게 생각했는지 글로 작성해보자
- 그럼 이것이 optimal substructure을 나타내는 지 생각해보자. 증명할 수 있다면 더할나위없이 완벽!
- 완전탐색으로 접근한다면 답을 내기 쉬워진다. 이 문제에선 2번째 수열까지 연속합중 최대값을 구하는 문제라고 본다면 1번째 수열이 최대값인 경우, 1~2까지 의합이 최대인 경우, 2번째 값이 최대인 경우가 있다. 여기서 내가 단계를 i번째 수라고 정의하였고, 그 단계가 최적값에 영향을 주는 요인이므로 2번째까지의 합 중 최대는 f(2) = max(a_2,f(1)+a_2) 라 말할 수 있고, 1번째가 최대일 수 있으므로 답은 max(f(1),f(2))가 된다. 이렇게 순환적사고로, 완전탐색으로 접근하면 간편해진다. (이 문제에서는 dp가 문제의 최적 값이 아닌, 연속합일 때의 최적 값을 나타낸다. 이는 내가 어떻게 문제를 풀었는지 손으로 적다보면 알게 됨.)
- 코딩하여 답을 출력한다.
- 간단 팁은 일반적으로 최적값은 배열로 dp 배열을 선언하고, 차수는 변수의 수만큼 선언한다. 이 문제에선 단계라는 변수 1개가 있으므로 1차원 dp를 선언한다. (knapsack 문제(배낭문제) 에서는 물건의 가치, 무게 2개의 변수가 있으므로 2차원 배열 선언) 그리고 i번째 인덱스엔 i번째 때의 최적값을 대입한다.
- 1번째 2번째 단계의 최적 값을 푸는 건 간단하다.(이게 어렵다면 정말 어려운 문제다.)
n = int(input())
nums = list(map(int,input().split()))
dp = [0 for _ in range(n)]
rst = nums[0] #초기 최대 값 설정
dp[0] = nums[0] #0번째 초기화. i-1번째를 볼 것이므로 0번째 초기화 후 1번째부터 풀이
for i in range(1,n):
dp[i] = max(nums[i],nums[i]+dp[i-1])
if dp[i]>rst:
rst = dp[i]
print(rst)
반응형
'알고리즘 문제 풀이' 카테고리의 다른 글
[백준]17837.새로운게임2 (0) | 2020.03.05 |
---|---|
[백준]11057.오르막수 (0) | 2020.03.04 |
[백준]2163.초콜릿자르기 (미제) (0) | 2020.03.03 |
[백준]9461.파도반수열 (0) | 2020.03.03 |
[백준]11053. 가장 긴 증가하는 부분 수열 (0) | 2020.03.02 |
Comments