문제
n개의 정수로 이루어진 임의의 수열이 주어진다. 우리는 이 중 연속된 몇 개의 수를 선택해서 구할 수 있는 합 중 가장 큰 합을 구하려고 한다. 단, 수는 한 개 이상 선택해야 한다.
예를 들어서 10, -4, 3, 1, 5, 6, -35, 12, 21, -1 이라는 수열이 주어졌다고 하자. 여기서 정답은 12+21인 33이 정답이 된다.
입력
첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다.
출력
첫째 줄에 답을 출력한다.
내가 푼 풀이
- 연속된 몇개의 수의 합들의 최댓값을 구하면 된다.
- 이중 for문을 통한 완전 탐색은 시간초과가 뜬다.
- index 0 의 최대로 더할수 있는 갯수는 정수 n만큼, 마지막 원소의 최대로 더할수 있는 갯수는 마지막원소 하나 뿐이다.
n개의 정수로 이루어진 수열의 배열 arr
연속된 수의 합의 최댓값 점화식: dp[i] = max(dp[i-1] + arr[i], arr[i])
max(dp[i-1] + arr[i], arr[i]) 에서 arr[i] 가 더 큰경우, i-1까지 더한 값들을 모두 지우고 i번째에서 새출발 하는 것이다.
이는, 연속적으로 수열의 합을 구해도 i-1번째까지의 합이 더 작으므로, 더해봤자 최댓값을 구할 수 없게되는 것이다.
import Foundation
var count = Int(String(readLine()!))!
var dp = Array(repeating: 0, count: count)
var arr = readLine()!.split(separator: " ").map{ Int(String($0))!}
for i in 0..<count {
if i == 0 {
dp[i] = arr[0]
continue
}
dp[i] = max(arr[i], dp[i-1] + arr[i])
}
print(dp.max()!)
'코딩테스트 > 백준' 카테고리의 다른 글
BOJ-2156 포도주 시식 Swift (0) | 2023.04.19 |
---|---|
BOJ-9461 파도반 수열 Swift (1) | 2023.04.19 |
BOJ-1932 정수 삼각형 Swift (0) | 2023.04.19 |
BOJ-11053 가장 긴 증가하는 부분 수열 Swift (0) | 2023.04.19 |
BOJ-2579 계단 오르기 Swift (0) | 2023.04.18 |