https://www.acmicpc.net/problem/11441
11441번: 합 구하기
첫째 줄에 수의 개수 N이 주어진다. (1 ≤ N ≤ 100,000) 둘째 줄에는 A1, A2, ..., AN이 주어진다. (-1,000 ≤ Ai ≤ 1,000) 셋째 줄에는 구간의 개수 M이 주어진다. (1 ≤ M ≤ 100,000) 넷째 줄부터 M개의 줄에는
www.acmicpc.net
[풀이]
N 개 요소의 배열 에서
M 개마다 i, j 누적합을 구하는 문제이다
처음 풀이에서는 시간초과가 났다.
난이도에 비해 쉽다면,, 무조건 시간초과 나는 문제임을 주의하자!
✂️시간 초과 나는 문제
const fs = require('fs');
let input = fs.readFileSync('./input.txt').toString().trim().split('\n'); //[ '5', '10 20 30 40 50', '5', '1 3', '2 4', '3 5', '1 5', '4 4' ]
let n = Number(input[0]);
let m = Number(input[2]);
let arr = input[1].split(" ").map((el) => +(el));
// console.log('🍀', (input[3]).split(' ').map(el => +el)[0]);
let sumArr = [];
for(let i=0; i < m; i++) {
let I = (input[i+3]).split(' ').map(el => +el)[0]
let J = (input[i+3]).split(' ').map(el => +el)[1]
let sum = 0;
for(let j=I; j<=J; j++){
sum += arr[j-1]
}
sumArr.push(sum);
}
console.log(sumArr.join('\n'));
중첩된 반복문의 시간 복잡도 때문 -> 내부 반복문의 실행 횟수가 배열의 크기에 비례하여 더 많아질수록 실행 시간이 길어짐
📍 효율적인 알고리즘
시간 : 392ms
const fs = require('fs');
const input = fs.readFileSync('./input.txt').toString().trim().split('\n');
const n = Number(input[0]);
const arr = input[1].split(" ").map(el => +el);
let prefixSum = [];
prefixSum[0] = arr[0];
for (let i = 1; i < n; i++) {
prefixSum[i] = prefixSum[i - 1] + arr[i];
}
const m = Number(input[2]);
let sumArr = [];
for (let i = 0; i < m; i++) {
const [I, J] = input[i + 3].split(' ').map(el => +el);
let sum = prefixSum[J - 1] - (prefixSum[I - 2] || 0);
sumArr.push(sum);
}
console.log(sumArr.join('\n'));
누적 합을 사용하여 각 구간의 합을 미리 계산 (필요한 구간의 합을 빨리 조회 -> 시간 단축)
I~J누적합 = 0~J인덱스까지의 누적합 - 0~I인덱스 까지 의 누적합
🔎 Array.prototype.forEach()
: 각 배열 요소에 대해 제공된 함수를 한 번씩 실행
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach
Array.prototype.forEach() - JavaScript | MDN
Array 인스턴스의 forEach() 메서드는 각 배열 요소에 대해 제공된 함수를 한 번씩 실행합니다.
developer.mozilla.org
const array1 = ['a', 'b', 'c'];
array1.forEach((element) => console.log(element));
// Expected output: "a"
// Expected output: "b"
// Expected output: "c"
🔎 String.prototype.trim()
: 문자열 양 끝 공백 제거후 새로운 문자열 반환
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/trim
String.prototype.trim() - JavaScript | MDN
trim() 메서드는 문자열 양 끝의 공백을 제거하고 원본 문자열을 수정하지 않고 새로운 문자열을 반환합니다. 여기서 말하는 공백이란 모든 공백문자(space, tab, NBSP 등)와 모든 개행문자(LF, CR 등)를
developer.mozilla.org
const greeting = ' Hello world! ';
console.log(greeting);
// Expected output: " Hello world! ";
console.log(greeting.trim());
// Expected output: "Hello world!";
'자료구조+알고리즘 > BOJ' 카테고리의 다른 글
[백준18870-silver2] 좌표 압축 (javascript) (2) | 2024.03.07 |
---|---|
[백준2751-silver5] 수 정렬하기 2 (javascript) (0) | 2024.03.07 |
[백준2167-silver5] 2차원 배열의 합 (javascript) (1) | 2024.03.05 |
[BOJ-10845_silver4] 큐 (자바스크립트) (0) | 2024.03.02 |
[BOJ-11866_silver5]요세푸스 문제 0 (자바스크립트) (1) | 2024.03.02 |