반응형
[Silver II] 수익 - 4097
성능 요약
메모리: 41372 KB, 시간: 1080 ms
분류
다이나믹 프로그래밍(dp)
문제 설명
연종이는 창업했다. 오늘은 창업한지 N일이 되었고, 매일 매일 수익을 적어놓았다.
어느 날 연종이는 가장 많이 돈을 번 구간이 언제인지 궁금해졌다.
오늘이 창업한지 6일 되었고, 수익이 다음과 같다고 하자.
- 1일: -3
- 2일: 4
- 3일: 9
- 4일: -2
- 5일: -5
- 6일: 8
이때, 가장 많은 돈을 번 구간은 2~6까지이고 총 수입은 14이다.
입력
입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫째 줄에는 N이 주어져 있다. (1 ≤ N ≤ 250,000) 둘째 줄부터 N개의 줄에는 매일 매일의 수익 P가 주어진다. (-10,000 ≤ P ≤ 10,000) 수익은 첫 날부터 순서대로 주어진다. 입력의 마지막 줄에는 0이 주어진다.
출력
각 테스트 케이스에 대해서 가장 많은 수익을 올린 구간의 수익을 출력한다. 단, 구간이 비어있으면 안 된다.
import sys
input = sys.stdin.readline
while True:
n = int(input())
if n == 0:
break
elif n == 1:
num = int(input())
print(num)
else:
dp = []
for i in range(n):
num = int(input())
dp.append(num)
for i in range(1,n):
dp[i] = max(dp[i], dp[i]+dp[i-1])
print(max(dp))
너무나 일반적인 점화식의 DP라 규칙을 찾아 금방 풀 수 있었다.
연속적인 가장 큰 부분을 찾으면 되기 때문에, 해당 인덱스의 값과 해당인덱스 이전과 현재를 더한 값과 비교하여 최댓값을 계속 가져오면된다. 여기서 dp[-1]을 출력해도 될 줄 알았는데 그냥 시간초과가 나 버려서 이유가 뭔지 조금 더 고민 중이다.
'알고리즘' 카테고리의 다른 글
[Bronze II] 거꾸로 구구단 - 13410 (브루트포스) (1) | 2022.09.22 |
---|---|
[Silver II] A → B - 16953 (그래프 탐색, 그리디) (1) | 2022.09.21 |
[Silver I] 어두운 건 무서워 - 16507 (누적합) (1) | 2022.09.20 |
[프로그래머스][level 1][카카오 인턴] 키패드 누르기 - 67256 (1) | 2022.09.19 |
[Silver III] 바이러스 - 2606 (그래프 탐색) (1) | 2022.09.18 |