Sangil's blog

https://github.com/ChoiSangIl Admin

이동평균 알고리즘 JAVA DEV / ALGORITHM

2021-05-10 posted by sang12


이동평균이란

주식에 발을 들이민 사람이라면 이평선이란 용어를 많이 들어 봤을 것이다. 3일 이동평균선이란 오늘을 포함한 3일동안의 평균값을 나타낸다. 예를들면 아래와 같다.


1일2일3일4일5일6일7일
주식가격100040007000550090001000015000
이동평균 (3일)

400055007166816611333
이동평균 (4일)


4375637578759875

내 주식도 저렇게 오르면 좋으련만... 3일의 이동평균값을 보면 1000+4000+7000/3 이란거를 볼 수 있다. 해당 알고리즘을 자바로 표현하면 아래와 같다.

이동평균 알고리즘(JAVA)

public class moving {
	public static void main(String[] args) {
		int m=4;
		int[] list = {1000, 4000, 7000, 5500, 9000, 10000, 15000};
                int n= list.length;
		List<Integer> result = new ArrayList<Integer>();
		
		for(int i=m-1; i<n; i++) {
			int sum = 0;
			for(int j=0; j<m; j++) {
				sum = sum + list[i-j];
			}
			result.add(sum/m);
		}
		System.out.println(result);
	}
}

알고리즘 개선

다시 7일간의 주식 가격을 확인해봅시다. 3일의 이평선값을 구하는 공식은 아래와 같습니다.

1일2일3일4일5일6일7일
주식가격100040007000550090001000015000
이동평균(3일)

400055007166816611333

3일 이동평균의 값 : (1000+4000+7000)/3
4일 이동평균의 값 : (4000+7000+5500)/3
5일 이동평균의 값 : (7000+5500+9000)/3

여기서 공통점이 보이시나요? 4일의 이동평균을 구하기 위해서는 3일의 이동평균값을 구하기위한 전체 값에서 1일 주식가격을 빼고 4일의 주식가격을 더해주면 됩니다. 5일의 이동평균값도 마찬가지로 4일의 이동평균값을 구하기위한 전체 가격에서 2일의 주식가격을빼고 5일의 주식가격을 더한뒤 3으로 나눠주면 됩니다. 그럼 이제 해당 공식을 코드로 구현해 봅시다.

개선된 이동평균 알고리즘(JAVA)

public class moving {
	public static void main(String[] args) {
		int m=3;
		int[] list = {1000, 4000, 7000, 5500, 9000, 10000, 15000};
                int n= list.length;
		List<Integer> result = new ArrayList<Integer>();
		
		int sum = 0;
		
		for(int i=0; i<m-1; i++) {
			sum = sum+list[i];	//m-1까지의 부분sum
		}
		
		for(int i=m-1; i<n; i++) {
			sum = sum + list[i];
			result.add(sum/m);
			sum = sum - list[i-m+1];  
		}
		
		System.out.println(result);
	}
}

여기서 우리는 중복되는 부분을 활용하여 이중 for문으로 구현한 알고리즘에서 for문 2개로 구성된 코드로 개선할 수 있었습니다. 이때 for문이 반복 되는 횟수는 n의 정비례하여 증가 하게 됩니다. 하여 해당 알고리즘을 선형 시간 알고리즘이라고 부릅니다 :)


#선형시간알고리즘
REPLY