백준-Node.js-11659

송철진·2023년 2월 2일
0

백준-Node.js

목록 보기
3/71

풀이

주어진 배열에서 서로 더하려는 범위값 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')
}
profile
검색하고 기록하며 학습하는 백엔드 개발자

0개의 댓글