https://www.acmicpc.net/problem/1912
1912번: 연속합
첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다.
www.acmicpc.net
📌 작성한 코드
// 1912
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "Beakjoon/Silver/test.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\n");
const N = Number(input[0]);
const list = input[1].split(" ").map(Number);
const dp = new Array(N);
let answer = list[0];
dp[0] = list[0];
for (let i = 1; i < N; i++) {
dp[i] = Math.max(dp[i - 1] + list[i], list[i]);
if (answer < dp[i]) answer = dp[i];
}
console.log(answer);
📌 설명
dp를 사용해서 각 단계에 도달했을 때 최대값을 저장하여 최종적인 최대 연속합을 구하는 문제이다.
정의 : dp[i] - 0 ~ i번째 숫자까지 도달했을 때 연속된 숫자의 최대값
점화식 : dp[i] = max(dp[i-1] + list[i], list[i])
- 연속합을 구하는 경우에 할 수 있는 동작은 두가지가 존재한다. (1) 이전 합에 현재 숫자 더하기 (2) 이전 합을 버리고 현재부터 시작하기
- 이전에 구한 합에 현재 숫자를 더한게 더 크다면 더한 값을 저장하고, 작다면 현재부터 다시 더하기 시작하는 것이다.
- 이때 dp의 마지막 요소에 최대값이 저장되어 있다는 보장이 없다. (각 단계별 최대값을 저장하는 것이지 전체 최대값을 저장하는 것이 아니기 떄문이다)
- 그래서 최대값은 변수를 사용해서 따로 저장하고 관리해준다.
// input
10
10 -4 3 1 5 6 -35 12 21 -1
// output (dp array)
[10, 6, 9, 10, 15, 21, -14, 12, 33, 32] // 마지막 요소가 최대값이 아님
✅ 성공

'알고리즘 > 백준' 카테고리의 다른 글
| [JavaScript/Greedy] 백준 골드 5 : 11000 - 강의실 배정 (0) | 2024.02.19 |
|---|---|
| [JavaScript/DP] 백준 실버 3 : 11727 - 2xn 타일링 2 (0) | 2024.02.17 |
| [JavaScript/DP] 백준 실버 1 : 1932 - 정수 삼각형 (0) | 2024.02.16 |
| [JavaScript/DP] 백준 실버 3 : 1003 - 피보나치 함수 (0) | 2024.02.16 |
| [JavaScript/DP] 백준 실버 1 : 12852 - 1로 만들기 2 (1) | 2024.02.16 |