문제 요건
N개의 숫자가 주어지면 연속부분수열의 합이 5 이하가 되는 경우를 구하여라
코드
function solution(arr, m) {
let sum = 0, lt = 0
let answer = 0
for(let rt=0; rt<arr.length; rt++) {
sum += arr[rt]
while(sum > m) {
sum -= arr[lt++]
}
answer += rt-lt+1 // 연속 부분수열에서 추가되는 갯수 +
}
return answer
}
let arr = [1,3,1,2,3]
let m = 5결과정리
이문제 또한 연속 부분수열에 대한 코드이다.
이번 문제에서 중요했던 부분은 역시 lt,rt 기준점을 잡는것과 연속부분수열에 대한 갯수를 더하는 부분이다.
answer += rt-lt+1 // 연속 부분수열에서 추가되는 갯수 +연속된 숫자 lt를 고정 후 rt 를 증가시켜가면서 rt 가 증가하였을때 N 개의 연속된 숫자에 추가되는 갯수는 rt - lt + 1 개이다.
즉, lt = 0, rt = 1 인경우 통과 후 rt 가 증가하면서 rt = 2 가되고 내부 arr 값중 1,3,1 까지 오게되며 이 사이의 마지막 1이 추가되면서 발생하는 연속부분수열 갯수는 {1}, {3,1} , {1,3,1} 3개이며 이는 2 - 0 + 1 이렇게 3개가 나온다.
이부분을 명심하며 기록하고 추후 사용하도록한다.
Key Point
- lt , rt 기준 구하기
- 연속된 숫자에 추가되는 부분수열 갯수 rt - lt + 1
