[프로그래머스] 2단계 연속된 부분 수열의 합 - 자바스크립트

KUKJIN LEE's profile picture

KUKJIN LEE3개월 전 작성

비내림차순으로 정렬된 수열이 주어질 때, 다음 조건을 만족하는 부분 수열을 찾으려고 합니다. 수열을 나타내는 정수 배열 sequence와 부분 수열의 합을 나타내는 정수 k가 매개변수로 주어질 때, 위 조건을 만족하는 부분 수열의 시작 인덱스와 마지막 인덱스를 배열에 담아 return 하는 solution 함수를 완성해주세요. 이때 수열의 인덱스는 0부터 시작합니다.

 

function solution(sequence, k) {
  let startIndex = 0;
  let endIndex = 0;
  let sum = sequence[0];
  let result = null;

  while (startIndex <= endIndex && endIndex < sequence.length) {
    if (sum === k) {
      if (result === null || endIndex - startIndex < result[1] - result[0]) {
        result = [startIndex, endIndex];
      }
      sum -= sequence[startIndex];
      startIndex++;
    } else if (sum < k) {
      endIndex++;
      sum += sequence[endIndex];
    } else {
      sum -= sequence[startIndex];
      startIndex++;
    }
  }
  return result;
}

 

  • 변수 초기화:

    • startIndexendIndex는 시작과 끝 인덱스를 나타냅니다. 초기값은 둘 다 0입니다.

    • sum은 현재 합을 나타내며, 초기값은 sequence[0]입니다.

    • result는 합이 k인 가장 짧은 부분 수열의 시작과 끝 인덱스를 저장하며, 초기값은 null입니다.

  • 부분 수열 탐색:

    • while (startIndex <= endIndex && endIndex < sequence.length): 범위가 유효한 동안 반복합니다.

    • if (sum === k):

      • 현재 부분 수열의 합이 k인 경우, result를 갱신합니다.

      • if (result === null || endIndex - startIndex < result[1] - result[0]): 현재, 이전의 값 보다 짧으면 result를 갱신합니다.

      • sum -= sequence[startIndex]: 현재 시작 인덱스의 값을 합에서 빼고, startIndex를 증가시킵니다.

    • else if (sum < k):

      • 현재 부분 수열의 합이 k보다 작은 경우, endIndex를 증가시킵니다.

      • if (endIndex < sequence.length): endIndex가 배열의 범위를 넘어가지 않도록 체크합니다.

      • sum += sequence[endIndex]: 새로운 끝 인덱스의 값을 합에 더합니다.

    • else:

      • 현재 부분 수열의 합이 k보다 큰 경우, startIndex를 증가시킵니다.

      • sum -= sequence[startIndex]: 현재 시작 인덱스의 값을 합에서 뺍니다.

  • 결과 반환:

    • return result: 합이 k인 가장 짧은 부분 수열의 시작과 끝 인덱스를 반환합니다.

New Tech Posts