비내림차순으로 정렬된 수열이 주어질 때, 다음 조건을 만족하는 부분 수열을 찾으려고 합니다.
수열을 나타내는 정수 배열 sequence와 부분 수열의 합을 나타내는 정수 k가 매개변수로 주어질 때, 위 조건을 만족하는 부분 수열의 시작 인덱스와 마지막 인덱스를 배열에 담아 return 하는 solution 함수를 완성해주세요. 이때 수열의 인덱스는 0부터 시작합니다.
5 ≤ sequence의 길이 ≤ 1,000,000
5 ≤ k ≤ 1,000,000,000
sequence : [1, 2, 3, 4, 5]
k : 7
[2, 3]
function solution(sequence, k) {
let minSequence = [];
let answer = [];
let start = 0;
let sum = 0;
for(let i=0; i<sequence.length; i++) {
sum += sequence[i];
while (sum > k && start <= i) {
sum -= sequence[start++];
}
if(sum===k) {
if(minSequence.length===0 || minSequence.length>i-start+1) {
minSequence = sequence.slice(start, i+1);
answer = [start, i];
}
}
}
return answer;
}
당연하게 투포인터겠거니 하고 2중 for문으로 접근했다가 바로 제한사항을 보고 2중 for문은 절대 안 될 것 같다 싶어서 바로 생각을 다시 했다. 일부 수열만을 가져오는 게 아니고 연속된 수열이기 때문에 start 부분만 고정시키고 index를 이동시키면서 sum을 벗어날 때마다 start의 위치를 오른쪽으로 옮기면 되겠구나 싶었다. 이런 문제를 풀어본 것..? 같아서 금방 떠올랐다.