CodeWars 코딩 문제 2021/01/29 - Sums of Parts

이호현·2021년 1월 29일
0

Algorithm

목록 보기
70/138

[문제]

Let us consider this example (array written in general format):

ls = [0, 1, 3, 6, 10]

Its following parts:

ls = [0, 1, 3, 6, 10]
ls = [1, 3, 6, 10]
ls = [3, 6, 10]
ls = [6, 10]
ls = [10]
ls = []

The corresponding sums are (put together in a list): [20, 20, 19, 16, 10, 0]

The function parts_sums (or its variants in other languages) will take as parameter a list ls and return a list of the sums of its parts as defined above.

Other Examples:

ls = [1, 2, 3, 4, 5, 6]
parts_sums(ls) -> [21, 20, 18, 15, 11, 6, 0]

ls = [744125, 935, 407, 454, 430, 90, 144, 6710213, 889, 810, 2579358]
parts_sums(ls) -> [10037855, 9293730, 9292795, 9292388, 9291934, 9291504, 9291414, 9291270, 2581057, 2580168, 2579358, 0]

Notes

  • Some lists can be long.
  • Please ask before translating: some translations are already written and published when/if the kata is approved.

(요약) 주어진 배열의 총 합부터 첫 번째 요소에서 마지막 요소까지 차의 누적값을 배열에 쌓아라.

[풀이]

function partsSums(ls) {
  let sumNum = ls.reduce((acc, num) => acc += num, 0);
  const answer = [sumNum];
  const length = ls.length;

  for(let i = 0; i < length; i++) {
    sumNum -= ls[i];
    answer.push(sumNum);
  }

  return answer;
}

배열의 총합을 구해서 첫 요소로 넣고, 반복문으로 앞에서부터 빼가면서 배열에 push.

아래 두 로직은 시간 초과되는데 테스트 케이스에 요소가 만개 넘는게 있던데
pop이 시간 초과되는 뭔가 이유가 있는거 같은 느낌

function partsSums(ls) {
  const answer = [0];

  while(ls.length) {
    const sumNum = answer[0] + ls.pop();
    answer.unshift(sumNum);
  }

  return answer;
}
function partsSums(ls) {
  const answer = [0];
  const length = ls.length - 1;

  for(let i = length; i >= 0; i--) {
    const sumNum = answer[0] + ls.pop();
    answer.unshift(sumNum);
  }

  return answer;
}
profile
평생 개발자로 살고싶습니다

0개의 댓글