leetCode 문제 풀이 1588번 Sum of All Odd Length Subarrays (JS)

devmomo·2021년 3월 13일
1

알고리즘

목록 보기
31/52
post-thumbnail

1588. Sum of All Odd Length Subarrays

문제
양의 정수를 원소로 하는 arr가 매개변수로 주어질 때, 전체 arr 중 홀수 개수만큼 연속된 원소를 뽑아 배열의 합을 구하고 이를 전부 더한 값을 return하는 함수 만들기

조건
1. arr의 길이는 1이상 100이하
2. arr[i]는 1이상 1000이하

풀이

var sumOddLengthSubarrays = function(arr) {
 const newarr = new Array(Math.floor((arr.length+1)/2)).fill(0);
 const sumEl = arr.reduce((a,b)=>a+b);
 newarr[0] = sumEl;
 if(!newarr[newarr.length-1] && arr.length%2 === 1){
     newarr[newarr.length-1] = sumEl;
 }
 if(arr.length>=3){
     for(let i = 1; i<newarr.length; i++){
     let sum = 0;
     for (let j = 0; j<arr.length; j++){
         if(arr[j+(i*2)]){
             let temp = arr.slice(j,j+1+(i*2)).reduce((a,b)=>a+b);
             sum += temp;
         } else{
             break;
         }
     }
         newarr[i] = sum;
     }
 }
return newarr.reduce((a,b)=>a+b);
};

다른풀이

const sumOddLengthSubarrays = arr => {
  const n = arr.length;
  let sum = 0;
  let k = 1;
  while(n >= k) {
    for(let i = 0; i < n - k + 1; i++){
      const currentSubArray = arr.slice(i, i + k);
      sum += currentSubArray.reduce((a,b) => a + b, 0);
    }
    k += 2;
  }
  return sum;
};

첫 풀이는 풀면서 접근을 잘못했나 싶었는데, 역시나 노가다성으로 풀어서 찝찝했다..
퍼포먼스는 수정을 거친 코드와 유사하지만, 가독성을 생각하면 좋지 못했다.
while 안에 for문을 활용하고, 변수와 상수를 명확히 구분해서 k와 sum에만 집중했다. k는 뽑아야 하는 수의 개수를 나타내고, sum은 for문을 돌며 배열의 값을 추가적으로 계속 더했다. 느낀 점이 많았던 좋은 문제 **

profile
FE engineer

0개의 댓글