INDEX
![](https://blog.kakaocdn.net/dn/cBroSd/btszwg8eMV9/P3NzrhQSjaK05kuxGSKPhk/img.png)
https://school.programmers.co.kr/learn/courses/30/lessons/178870#
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
Solution
수열을 순회하면서 연속된 수열의 합이 K인 원소의 인덱스를 찾으면 됩니다.
예제로 주어진 sequence를 도식화해 보면 다음과 같습니다.
![](https://blog.kakaocdn.net/dn/b0owPw/btszrM8gcw2/xcJlEffInGJ4cgb1Vf76wK/img.png)
연속된 수열의 합을 구하기 위해선 처음 INDEX 와 끝 INDEX가 필요합니다.
let startIdx = 0;
let endIdx = 0;
let answer = [0, 1000000]; //끝 INDEX와 처음 INDEX의 차이가 작을수록 정답이 되기 때문에 answer 은 최대값으로 초기화
let sum = sequence[0]; //현재는 1
이 배열은 비내림차순 즉, 올림차순이라고 생각하면 수열의 합이 K보다 작으면 endIdx를 오른쪽으로 밀고 K보다 크면 startIdx를 오른쪽으로 밀면 됩니다. 왜냐하면 endIdx를 오른쪽으로 밀면 startIdx부터 endIdx까지의 수열의 합이 더 커질 것이고 startIdx를 오른쪽으로 밀면 수열의 합이 작아지기 때문입니다.
현재는 합이 1이기 때문에 K인 7보다 작습니다. 따라서 endIdx 를 오른쪽으로 이동합니다.
if(sum < k){
endIdx++;
sum += sequence[endIdx];
}
![](https://blog.kakaocdn.net/dn/bHB9bX/btsznB0qjEj/LB62wJAG2bfq34wpzwBqR1/img.png)
합이 3이기 때문에 endIdx를 오른쪽으로 이동합니다.
![](https://blog.kakaocdn.net/dn/bfu0b0/btszsD4q7Hx/ORkPNMsnHK4cxjncAdOJX0/img.png)
여전히 합이 6이므로 K보다 작습니다. endIdx 를 오른쪽으로 이동합니다.
![](https://blog.kakaocdn.net/dn/kYXAR/btszojZMn0i/bk2dvfyfCTVJKzqDr05TB1/img.png)
이번엔 합이 K보다 작습니다. startIdx를 오른쪽으로 이동합니다.
if(sum > k){
sum -= sequence[startIdx]
startIdx++;
}
![](https://blog.kakaocdn.net/dn/bqU3cz/btszuvykmKp/9Ft34XyAaRuYmUEjuA8n61/img.png)
합이 K가 되었습니다. 이제 startIdx 와 endIdx를 정답에 담습니다.
if(sum === k){
answer = answer[1]- answer[0] > endIdx - startIdx ? [startIdx, endIdx] : answer;
endIdx++;
sum += sequence[endIdx];
}
이런 식으로 endIdx 가 끝에 도달할 때까지 해주면 됩니다.
전체코드
function solution(sequence, k) {
let startIdx = 0;
let endIdx = 0;
let answer = [0, 1000000];
let sum = sequence[0];
while(endIdx !== sequence.length){
if(sequence[endIdx] === k) return [endIdx, endIdx]
if(sum === k){
answer = answer[1]- answer[0] > endIdx - startIdx ? [startIdx, endIdx] : answer;
endIdx++;
sum += sequence[endIdx];
}
else if(sum < k){
endIdx++;
sum += sequence[endIdx];
}
else if(sum > k){
sum -= sequence[startIdx]
startIdx++;
}
}
return answer;
}
'알고리즘 스터디' 카테고리의 다른 글
[Programmers] 연속 부분 수열 합의 개수 - Golang (0) | 2023.11.03 |
---|---|
[Programmers] 택배상자 - Javascript (0) | 2023.11.02 |
[Programmers] 롤케이크 자르기 -Javascript 번외편<왜 이게 안돼?> (0) | 2023.10.30 |
[Programmers] 과제 진행하기 - Javascript (0) | 2023.10.21 |
[Programmers] 이모티콘 할인행사 - Javascript (0) | 2023.10.16 |