[백준] 1912. 연속합 (자바스크립트/javascript/js/node.js/동적계획법/동적프로그래밍/다이나믹프로그래밍)
2021. 7. 13. 14:08ㆍFront-end/알고리즘
728x90
반응형
문제를 풀기 위한 아이디어
1. 직전까지의 부분합 + 현재 가리키고 있는 수
2. 현재 가리키고 있는 수
를 비교하여 더 큰 값을 부분합으로 저장한다.
즉, 지금까지 연속해서 더한 부분합+현재 가리키고 있는 수와 그냥 현재 가리키고 있는 수를 비교했는데 현재 가리키고 있는 수가 더 크다면 미련없이 이전 수들을 버리고 새롭게 시작하여도 OK라는 것이다.
예제 1을 가지고 예를 들어보면, [10, -4, 3, 1, 5, 6, -35, 12, 21, -1]에서
dp[7]까지는 쭉 더하다가 8번째 수인 12를 만났을 때 -14 + 12 vs 12를 비교해서 12가 더 크기 때문에 이전 값을 다 버리고 12부터 시작하는 것이다.
그렇게 해서 구한 모든 dp 값 중 최댓값을 출력하면 된다.
내가 구현한 코드 (자바스크립트)
let fs = require("fs");
let numbers = fs.readFileSync("예제.txt").toString().split("\n");
const N = Number(numbers[0]);
numbers = numbers[1]
.trim()
.split(" ")
.map((element) => Number(element));
numbers.unshift(0);
const dp = new Array(N + 1);
dp[0] = numbers[1];
dp[1] = numbers[1];
for (let i = 2; i <= N; i++) {
// 직전까지의 부분 합 + 현재 값 : dp[i-1] + numbers[i]
// 현재 값 : numbers[i]
if (dp[i - 1] + numbers[i] >= numbers[i]) {
// 직전까지의 부분 합 + 현재 값이 가장 클 때
dp[i] = dp[i - 1] + numbers[i];
} else {
// 현재 값이 가장 클 때
dp[i] = numbers[i];
}
}
console.log(Math.max(...dp));
728x90
반응형