본문 바로가기

알고리즘

입력 받은 정수형 배열에서 배열 평균과 가장 가까운 원소의 값과 순서(인덱스 +1)를 반환하는 알고리즘

import java.io.*;
import java.lang.*;
import java.util.*;


public class Main {
	public static final Scanner scanner = new Scanner(System.in);


	/**
    * 평균과의 차가 가장 작은 데이터의 번호를 반환하는 함수
    * 여러 가지라면 가장 빠른 번호를 반환한다.
    *
    * @param data 
    * @param n 
    * @return int  가장 평균과 가까운 데이터의 번호 (1번부터 시작)
    */
	public static int findIndex(int[] data, int n){
		int S = 0;
		int x = 0;
		
		for(int i =0; i < n; i++){
			S += data[i];
		}
		
		//x := data[0] data[n-1] 사이에서 평균과 가장 가까운 원소의 인덱스
		for(int i =0; i < n; i++){
			int di = Math.abs(S - n * data[i]);//data[i]와 평균과의 거리
			int dx = Math.abs(S - n * data[x]);//data[x]와 평균과의 거리 (여태까지 가장 평균에 가까웠던 값의 거리)
			if(di < dx){
				x = i;
			}
		}
		
		return x + 1;
	}

	public static void main(String[] args)
	{
		int n = scanner.nextInt();
		int[] data = new int[n];
		for(int i = 0 ; i < n ; i++)
		{
			data[i] = scanner.nextInt();
		}

		int answer = findIndex(data, n);
		int index = answer - 1;
		System.out.printf("%d %d\n", answer, data[index]);
	}

}

처음 이 코드를 봤을 때, S - n * data[i] 구문이 이해가 되지 않았지만,

평균과의 거리(절대값) = 평균(S / n) - data[i];

라는 수식은 평균과 배열에 n을 곱한 것과 같다는 말을 듣고 정수로 변환할 수 있는 아래 수식이 더 편하다는 것을 알았다.

평균과의 거리(절대값) = S(평균 * n) - n * data[i];

 

10주 완성 알고리즘 코딩테스트 - goorm edu에서 들으실 수 있는 내용입니다.