https://www.acmicpc.net/problem/11659
11659번: 구간 합 구하기 4
첫째 줄에 수의 개수 N과 합을 구해야 하는 횟수 M이 주어진다. 둘째 줄에는 N개의 수가 주어진다. 수는 1,000보다 작거나 같은 자연수이다. 셋째 줄부터 M개의 줄에는 합을 구해야 하는 구간 i와 j
www.acmicpc.net
📌 작성한 코드
// 11659
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, M] = input.shift().split(" ").map(Number);
const list = input.shift().split(" ").map(Number);
const intervals = input.map((str) => str.split(" ").map(Number));
const dp = new Array(N + 1).fill(0);
dp[1] = list[0];
for (let i = 2; i <= N; i++) {
dp[i] = dp[i - 1] + list[i - 1];
}
let answer = "";
intervals.forEach(([i, j]) => {
answer += `${dp[j] - dp[i - 1]}\n`;
});
console.log(answer);
📌 풀이
(1) 0부터 i까지의 합을 dp를 통해 구한다.
- 정의 : dp[i] = 1번 숫자부터 i번 숫자까지의 합
- 점화식 : dp[i] = dp[i-1]+ list[i]
const dp = new Array(N + 1).fill(0);
dp[1] = list[0];
for (let i = 2; i <= N; i++) {
dp[i] = dp[i - 1] + list[i - 1]; // list는 0번 인덱스부터 저장되어 있으므로 -1 해서 접근
}
(2) i부터 j까지의 합을 구한다.
- `i부터 j까지의 합` = `0부터 j까지의 합` - `0부터 i-1까지의 합`
- 자바스크립트에서 console.log 하는데 시간이 많이 소요되어서, 답을 저장했다가 마지막에 한번에 출력해야 한다.
(각각 출력하려고 하면 시간 초과가 발생한다.)
let answer = "";
intervals.forEach(([i, j]) => {
answer += `${dp[j] - dp[i - 1]}\n`;
});
console.log(answer);
✅ 성공

'알고리즘 > 백준' 카테고리의 다른 글
| [JavaScript/DP] 백준 실버 1 : 12852 - 1로 만들기 2 (1) | 2024.02.16 |
|---|---|
| [JavaScript/DP] 백준 실버 3 : 11726 - 2xn 타일링 (0) | 2024.02.16 |
| [JavaScript/DP] 백준 실버 1 : 1149 - RGB 거리 (0) | 2024.02.16 |
| [JavaScript] 백준 골드 3 : 18808 - 스티커 붙이기 (0) | 2024.02.16 |
| [JavaScript] 백준 골드 4 : 15683 - 감시 (1) | 2024.02.16 |