
비내림차순으로 정렬된 수열이 주어질 때, 다음 조건을 만족하는 부분 수열을 찾으려고 합니다.
k입니다.k인 부분 수열이 여러 개인 경우 길이가 짧은 수열을 찾습니다.수열을 나타내는 정수 배열 sequence와 부분 수열의 합을 나타내는 정수 k가 매개변수로 주어질 때, 위 조건을 만족하는 부분 수열의 시작 인덱스와 마지막 인덱스를 배열에 담아 return 하는 solution 함수를 완성해주세요. 이때 수열의 인덱스는 0부터 시작합니다.
sequence의 길이 ≤ 1,000,000sequence의 원소 ≤ 1,000sequence는 비내림차순으로 정렬되어 있습니다.k ≤ 1,000,000,000k는 항상 sequence의 부분 수열로 만들 수 있는 값입니다.| sequence | k | result |
|---|---|---|
| [1, 2, 3, 4, 5] | 7 | [2, 3] |
| [1, 1, 1, 2, 3, 4, 5] | 5 | [6, 6] |
| [2, 2, 2, 2, 2] | 6 | [0, 2] |
function solution(sequence, k) {
let left = 0;
let right = 0;
let sum = sequence[0];
const result = [];
while (right < sequence.length) {
if (sum < k) {
// k보다 작으면 오른쪽 포인터 이동
right++;
sum += sequence[right];
} else if (sum > k) {
// k보다 크면 왼쪽 포인터 이동
sum -= sequence[left];
left++;
} else {
// k와 같으면 result에 push
result.push([left, right]);
right++; // 다른 값을 구하기 위해 포인터 이동
sum += sequence[right];
}
}
return result.sort(condition)[0];
}
function condition(a, b) {
const lenDiff = Math.abs(a[0] - a[1]) - Math.abs(b[0] - b[1]);
if (lenDiff !== 0) return lenDiff; // 길이에 따라 정렬
return a[0] - b[0]; // 그 외는 0번째 원소 index가 낮은 순서로 정렬
}
투포인터 알고리즘(Two-Pointers algorithm)