KUKJIN LEE
posted 4 months ago
[프로그래머스] 2단계 연속된 부분 수열의 합 - 자바스크립트
비내림차순으로 정렬된 수열이 주어질 때, 다음 조건을 만족하는 부분 수열을 찾으려고 합니다. 수열을 나타내는 정수 배열 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;
}
-
변수 초기화:
-
startIndex
와endIndex
는 시작과 끝 인덱스를 나타냅니다. 초기값은 둘 다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
인 가장 짧은 부분 수열의 시작과 끝 인덱스를 반환합니다.
-