https://leetcode.com/problems/k-radius-subarray-averages/description/

class Solution {
public int[] getAverages(int[] nums, int k) {
if(k == 0) {
return nums;
}
int[] answer = new int[nums.length];
for(int i = 0; i < nums.length; i++) {
answer[i] = -1;
}
long sum = 0; // 오버플로우 방지
for(int i = 0; i < nums.length; i++) {
sum += nums[i];
if(i - (k * 2) < 0) {
continue;
}
answer[i - k] = (int) (sum/(k*2+1));
// 한 칸 이동
sum-=nums[i-(2*k)];
}
return answer;
}
}

=> 근데 이렇게 어렵게 생각할 필요가 없었다! 그냥 슬라이딩 윈도우의 초기 합을 미리 구한 뒤, 그걸로 lt와 rt를 이용해 조작해주면 좀 더 간단함
class Solution {
public int[] getAverages(int[] nums, int k) {
int[] answer = new int[nums.length];
for(int i = 0; i < nums.length; i++) {
answer[i] = -1;
}
if(2 * k + 1 > nums.length) { // 2 * k + 1, 즉 윈도우 사이즈가 배열의 길이보다 크다면, -1인 배열 반환
return answer;
}
if(k == 0) { // 0이라면 그냥 첫 배열 반환해주면 됨
return nums;
}
long sum = 0; // 오버플로우 방지
int windowSize = 2 * k + 1;
for(int i = 0; i < windowSize; i++) {
sum += nums[i];
}
answer[k] = (int) (sum / windowSize); // 첫 평균 저장
// 첫 윈도우 rt + 1부터 시작
for(int i = windowSize; i < nums.length; i++) {
sum += nums[i]; // 한칸을 옮긴만큼 더해줌
sum -= nums[i-windowSize]; // 한칸을 옮겼으니까, lt만큼을 빼줌
answer[i - k] = (int) (sum / windowSize);
}
return answer;
}
}
class Solution {
public int[] getAverages(int[] nums, int k) {
long[] prefixSum = new long[nums.length];
prefixSum[0] = nums[0];
for(int i = 1; i < nums.length; i++) {
prefixSum[i] = prefixSum[i-1] + nums[i];
}
int answer[] = new int[nums.length];
Arrays.fill(answer, -1); // 굳이 for문 돌 필요 X
if(2 * k + 1 > nums.length) {
return answer;
}
int lt = 0;
long sum = 0;
answer[k] = (int) (prefixSum[2 * k] / (2*k+1));
for(int rt = 2 * k + 1; rt < nums.length; rt++) {
sum = prefixSum[rt] - prefixSum[lt];
lt++;
answer[rt - k] = (int) (sum / (2*k+1));
}
return answer;
}
}