M-3 | M-2 | M-1 | M | M+1 | M+2 | … | N |
---|---|---|---|---|---|---|---|
0 | 1 | 2 | |||||
1 | 2 | 3 | |||||
2 | 3 | 4 | |||||
3 | 4 | 5 | N |
/**
* 이동 평균선 구하기
* - 이동 평균이란? 시간에 따라 변화하는 값들의 평균
* - M-이동 평균? 마지막 M개의 평균.
* */
public double[] first(double[] A, int M) {
int N = A.length;
double[] answer = new double[N];
/* A[i]까지의 이동 평균 구하기 */
for (int i = M - 1; i < N; i++) {
double partialSum = 0;
/* 각 위치(i)에서 지난 M개의 평균 구하기. 현재 기준으로 M-1만큼 돌아간다. */
for (int j = 0; j < M; j++) { // j는 현재(i)를 기준으로 인덱스를 상대적으로 줄여나가기 위한 변수다
partialSum += A[i - j]; // 현재(=i)-0, 현재(i)-1, ..., 현재(i)-(M-1)
}
answer[i] = partialSum / M;
}
return answer;
}
[1,2]
, [2,3]
, [3,4]
등은 계속 중복되는 숫자들이다. 이 중복을 해결할 수 있다면 굳이 중첩 반복문을 돌 필요가 없다.M-3 | M-2 | M-1 | M | M+1 | M+2 | … | N |
---|---|---|---|---|---|---|---|
0 | 1 | 2 | |||||
1 | 2 | 3 | |||||
2 | 3 | 4 | |||||
3 | 4 | 5 | N |
public double[] second(double[] A, int M) {
int N = A.length;
double[] answer = new double[N];
double partialSum = 0;
/* 미리 중복되는 M-2까지의 합을 구해 둔다 */
for (int i = 0; i < M - 1; i++) { // M-1 인덱스가 현재(i)며, 현재는 아래 반복문에서 더한다
partialSum += A[i]; // M=3? A[0], A[1]
}
for (int i = M - 1; i < N; i++) {
partialSum += A[i]; // 현재를 더한다
answer[i] = partialSum / M;
partialSum -= A[i - (M - 1)]; // 다음을 위해 현재(i)의 이동 평균선 구하는 첫 시작 부분을 제거한다
}
return answer;
}