Leetcode Java Subarray Product Less Than K
업데이트:
문제
코드
class Solution {
public int numSubarrayProductLessThanK(int[] nums, int k) {
if (k == 0) {
return 0;
}
int count = 0;
int product = 1;
for (int i = 0, j = 0; j < nums.length; j++) {
product *= nums[j];
while (i <= j && product >= k) {
product /= nums[i++];
}
count += j - i + 1;
}
return count;
}
}
결과
설명
-
num의 연속된 값들의 부분 배열 내 모든 값을 곱한 결과가 k 미만인 부분 배열의 수를 구하는 문제이다.
-
nums내 최솟값은 1로 k가 0인 경우 나올 수 있는 경우가 없으므로, 0을 주어진 문제의 결과로 반환한다.
- 문제 풀이에 필요한 변수를 정의한다.
- count는 부분 배열 내 곱의 결과가 k 미만인 부분 배열의 수를 저장할 변수로, 0으로 초기화한다.
- product는 부분 배열 내 곱의 결과를 저장할 변수로, 최소 크기인 1로 초기화한다.
- i를 0으로 초기화시키고, 0부터 nums의 길이 미만까지 j를 증가시키며 아래를 반복한다.
- product에 nums의 j번째 값을 곱해준다.
- i가 j 이하이고 product가 k 이상일 때까지 아래를 반복하여 부분 배열을 만들 수 있는 개수를 산정한다.
- product에 nums의 i번째 값을 나누어 k 미만이 되는 부분 배열 곱의 결과를 구한다.
- i를 증가시킨 후 반복을 계속 수행하여 부분 배열에 포함될 숫자의 범위를 좁혀준다.
- 위를 통해 좁혀진 범위인 i와 j를 이용하여 $j - i + 1$을 count에 더해준다.
- 반복이 완료되면 부분 배열의 수를 계산한 count를 주어진 문제의 결과로 반환한다.
해설
- nums가 [10, 5, 2, 6]이고, k가 13인 경우를 예를 보면 아래의 두 경우가 복수개의 부분 배열의 범위가 된다.
- i가 2인 값이 2의 위치인 경우, 10이 포함되면 k를 넘으므로 [5, [2]] 형태로 [2], [5, 2]가 k 미만의 부분 집합이 2개가 된다.
- i가 3인 값이 6의 위치인 경우, 5부터 포함되면 k를 넘으므로 [2, [6]] 형태로 [6], [2, 6]가 k 미만의 부분 집합이 2개가 된다.
- 위와 같이 특정 값 미만의 연속된 값들이 부분 배열이 되면 해당 숫자 개수만큼 부분 배열이 완성된다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기