Given an integer array nums and an integer k, return the number of non-empty subarrays that have a sum divisible by k.
A subarray is a contiguous part of an array.
Example 1:
- Input: nums = [4,5,0,-2,-3,1], k = 5
- Output: 7
- Explanation: There are 7 subarrays with a sum divisible by k = 5:
[4, 5, 0, -2, -3, 1], [5], [5, 0], [5, 0, -2, -3], [0], [0, -2, -3], [-2, -3]
Example 2:
- Input: nums = [5], k = 9
- Output: 0
1 <= nums.length <= 3 * 104
-104 <= nums[i] <= 104
2 <= k <= 104
var subarraysDivByK = function (A, K) {
let sums = new Array(A.length + 1).fill(0);
let res = 0;
for (let i = 1; i <= A.length; i++) {
sums[i] = sums[i - 1] + A[i - 1];
}
console.log(sums);
let dp = new Array(K).fill(0);
dp[0] = 1;
for (let i = 1; i < sums.length; i++) {
let mod = ((sums[i] % K) + K) % K;
res = res + dp[mod];
dp[mod] = dp[mod] + 1;
}
return res;
};
합 K를 만들기 위해서는 Sliding Windows 처럼 총 합과 K로 나눈 나머지가 같은 array만큼을 빼면 합이 K의 배수가 되도록 할 수 있다. 그래서 res에 dp[mod]값을 계속해서 더해주며, sums[i]%K의 값이 음수가 나오는것을 방지하기 위해 +K % K를 다시 해준다.