문제 정보
- 문제 링크
- 난이도: Lv.2
- 문제 유형: 탐색, 슬라이딩 윈도우
풀이
슬라이딩 윈도우를 사용하는 문제다.
다만 이하 두 조건 때문에, 합이 k인 부분 수열을 찾고 끝내는 것이 아니라 주어진 배열 sequence의 끝까지 탐색해야 한다.
합이 k인 부분 수열이 여러 개인 경우 가장 짧은 수열을 찾습니다.길이가 짧은 수열이 여러 개인 경우 앞쪽(시작 인덱스가 작은)에 나오는 수열을 찾습니다.
코드
class Solution {
public int[] solution(int[] sequence, int k) {
int[] answer = new int[2];
int gap = sequence.length + 1;
int left = 0;
int right = 0;
int sum = 0;
for(right = 0; right < sequence.length; right++) {
sum += sequence[right];
while (sum > k) {
sum -= sequence[left];
left++;
}
if (sum == k && right - left + 1 < gap) {
gap = right - left + 1;
answer[0] = left;
answer[1] = right;
}
}
}
}