주어진 배열에서 서로 더하려는 범위값 i, j
에 대해
slice(i-1, j)
해서 reduce()
로 합을 구하면 메모리 초과
라고 뜬다
const fs = require('fs')
const input = fs.readFileSync('/dev/stdin').toString().trim().split('\n')
let arr = input[1].split(" ").map(Number)
let caseArr = input.slice(2).map(el => el.split(" ").map(Number))
const solution = (caseArray) => {
let result = []
for(let n = 0; n < caseArray.length; n++){
let [ i, j ] = caseArray[n]
result[n] = arr.slice(i-1, j).reduce((a,b) => a + b, 0)
}
return result.join('\n')
}
console.log(solution( caseArr )) // 메모리 초과
구글링과 질문하기 코너를 탐색해 다른 방법을 알게 되었다.
주어진 배열에서 서로 더하려는 범위값 [i, j]
에 대해 j
까지의 합에 i
까지의 합을 빼는 것으로 구할 수 있다.
// const input = ["5 3", "5 4 3 2 1", "1 3", "2 4", "5 5"]
const arr = input[1].split(' ').map(Number);
const sumArr = [ 0 ]
const solution = [];
arr.forEach((v, i) => {
sumArr[i+1] = sumArr[i] + v;
});
// sumArr = [0, 5, 9, 12, 14, 15]
// 각 요소 sumArr[i]는 arr의 i번째 수까지의 합이 된다
input.slice(2).forEach(el => {
const [i, j] = el.split(' ').map(Number);
solution.push(sumArr[j] - sumArr[i-1]);
});
console.log(solution.join('\n'));
map( )과 forEach( )는 배열을 순회하면서 각 요소들을 출력한다
특히, map( )은 콜백함수의 실행 결과를 모은 새 배열을 리턴한다
메모리 초과의 원인은 reduce() 때문인 것으로 보인다
대용량 배열 처리 시 reduce(), map(), filter()는 메모리 overflow
가능성이 있다고 함.
👉 https://uncertainty.oopy.io/memory-is-over-boj
👉 https://develogger.kro.kr/blog/LKHcoding/66
reduce()를 for...of로 바꿔 보았으나 여전히 메모리 초과...
const solution = (caseArray) => {
let result = []
for(let n = 0; n < caseCount; n++){
let [ i, j ] = caseArray[n]
for(let el of arr.slice(i-1, j)){
result[n] = (result[n] || 0) + el
}
}
return result.join('\n')
}