1. 문제
https://www.acmicpc.net/problem/6986
6986번: 절사평균
첫째 줄에 절사평균(N, K)를, 둘째 줄에 보정평균(N, K)를 각각 소수점이하 셋째 자리에서 반올림하여 둘째 자리까지 출력한다. 예를 들어 결과값이 9.667인 경우 9.67로, 5인 경우 5.00으로, 5.5인 경우
www.acmicpc.net
2. 풀이
간단한 계산 문제이다.
두 번째 줄부터 주어지는 입력을 배열에 넣고, 배열의 양 끝에서 입력으로 주어지는 K값만큼 제외하고 더한 후 평균을 구한다. (절사 평균)
그 후 절사 평균에서 제외한 수만큼을 보정하여 더한다.
이 말은 절사 평균 구할 때 더한 값 (예제 입력에서 보면 9.3 + 9.3 + 9.5)을 그대로 가져가면서 나머지 제외된 수(5.0, 9.1, 9.6, 9.8)을 보정하여 더해야 한다는 것이다.
남은 수에서 5.0, 9.1은 절사 평균을 구할 때 더한 값에서 9.3과 가까우므로 9.3을 두 번 더하고, 9.6, 9.8은 9.5와 가까우므로 9.5를 두 번 더한 후 평균을 구하면 된다.
이 때 double로 더할 경우 지수 부분 때문에 "틀렸습니다"가 나올 수 있으므로 (1e-8)을 더해주자!!
3. 소스 코드
import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
double[] arr = new double[N];
double result = 0.0;
for (int i = 0; i < N; i++) {
arr[i] = Double.parseDouble(br.readLine());
}
Arrays.sort(arr);
for (int i = K; i < N - K; i++) {
result += arr[i];
}
bw.write(String.format("%.2f", result / (N - (K * 2)) + 1e-8) + "\n");
for (int i = 0; i < K; i++) {
result += arr[K];
result += arr[N - K - 1];
}
bw.write(String.format("%.2f", result / N + 1e-8) );
bw.flush();
bw.close();
br.close();
}
}