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문을 돌며 배열의 값을 추가적으로 계속 더했다. 느낀 점이 많았던 좋은 문제 **