정수 배열의 최대합 구하기

GonnabeAlright·2022년 4월 14일
0
post-thumbnail

정수 배열과 숫자를 인수로 받는 maxSubarraySum이라는 함수에서 숫자는 최대합을 구성하는 개수가 됩니다. 정수 배열의 최대합을 구하시오.

배열 [1, 2, 3, 4]가 있다고 가정했을 때 arr[i], arr[i+1]을 기준으로 본다면 1 + 2 = 3이고 2 + 3 = 5이고 3 + 4 = 7입니다. 두 수의 합계를 기준으로 본다면 현재의 total은 3이고 다음 total을 구하기 위해서는 3에서 1을 뺀 2를 total에 더하여 5를 구하는 것입니다.

즉, arr[0] + arr[1]을 초기 합계(total)로 정하고 모든 배열을 선회하면서 다음 합계(currentTotal)를 구하고 total과 currentTotal값을 비교하여 크기가 더 큰 값total에 저장합니다.

결과

'use strict'

const maxSubarraySum = (arr, num) => {
  if (arr.length < num) return null;
  
  let total = 0;
  for (let i = 0; i < num; i++) {
    total += arr[i];
  }
  let currentTotal = total;
  for (let i = num; i < arr.length; i++) {
    currentTotal += arr[i] - arr[i - num];
    total = Math.max(total, currentTotal);
  }  
  return total;
}

maxSubarraySum([100, 200, 300, 400], 2); // 700
maxSubarraySum([1, 4, 2, 10, 23, 3, 1, 0, 20], 4); // 39
maxSubarraySum([-3, 4, 0, -2, 6, -1], 2); // 5
maxSubarraySum([3, -2, 7, -4, 1, -1, 4, -2, 1], 2); // 5
maxSubarraySum([2, 3], 3); // null

리뷰

  1. 인수로 전달받는 배열의 길이보다 num이 더 클 경우 null을 반환합니다.
  2. 변수 total0으로 초기화하고 배열에서 num 만큼의 배열 요소들을 순서대로 더하여 저장합니다.
  3. totalcurrentTotal 변수에 복사합니다. total값은 숫자형이므로 원시값에 속하여 값이 복사됩니다.
  4. 앞서 설명한 방식으로 다음 합계를 구하고 total과 currentTotal 값 중 더 큰 값을 리턴하는 Math.max()를 이용하여 값을 total에 저장합니다.
  5. 반복문을 순회하면서 각 요소들을 더한 합계 중 가장 큰 값이 total에 저장되므로 반복문이 종료되었을 때 total에는 가장 큰 합계가 저장되어있으며 이를 리턴합니다.

0개의 댓글