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에서 들으실 수 있는 내용입니다.
'알고리즘' 카테고리의 다른 글
1부터 정수 n까지 1 + (1 + 2) + (1 + 2 + 3) + .... + (1 + 1이상 n 이하 모든 정수의 합 )과 같은 식의 합을 구하는 알고리즘 (0) | 2023.04.19 |
---|---|
선택 정렬 알고리즘 (0) | 2023.04.18 |
입력 받은 문자열 배열에서 원하는 값의 첫번째 원소와 마지막 원소를 찾는 알고리즘 (0) | 2023.04.14 |
입력 받은 정수형 배열에서 원하는 값이 있는 인덱스를 반환하는 알고리즘 (0) | 2023.04.13 |
입력 받은 정수형 배열(몸무게)을 통해 놀이기구의 탑승 가능 여부를 출력하는 알고리즘 (1) | 2023.04.12 |