본문 바로가기
공부/아키텍처기반 응용소프트웨어 개발전문가 과정

자바 [절사평균 구하기]

by 자피킨치 2018. 3. 29.

Q) 절사평균 구하기

프로그램 명: koi_trim


체조나 다이빙 등의 경기에서 일부 심판이 자기가 좋아하는 선수에게 높은 점수를, 싫어하는 선수에게 낮은 점수를 주는 경우가 종종 있었다. 따라서 심판들이 주는 점수의 평균점수를 선수에게 주게 되면 공정하지 않은 경우가 생길 수 있다. 이를 방지하기 위하여 절사평균이나 보정평균을 사용한다.

예를 들어 심사위원 일곱 명이 다음과 같이 점수를 주었다고 하자.

9.3, 9.5, 9.6, 9.8, 9.1, 5.0, 9.3

전체의 합이 61.6이 되므로 평균은 8.8이 된다. 이 평균점수는 한 심판이 다른 심판에 비하여 아주 낮은 점수인 5.0을 주어서 나온 결과로, 선수는 매우 불공정하다고 느낄 것이다.

위의 점수를 작은데서 큰 순서로 정렬하면 5.0, 9.1, 9.3, 9.3, 9.5, 9.6, 9.8 이 된다.

이때 절사평균(7, 2)는 정렬된 전체 점수 일곱 개 중 양쪽 끝에서 두 개씩을 제외하고 난 9.3, 9.3, 9.5의 평균인 9.37이 된다(소수점이하 셋째 자리에서 반올림). 또 보정평균(7, 2)는 정렬된 전체 점수 일곱 개 중 양쪽 끝에서 각각 두 개를, 남은 점수 중 가장 가까운 것으로 교체한 9.3, 9.3, 9.3, 9.3, 9.5, 9.5, 9.5의 평균으로 9.39가 된다(소수점이하 셋째 자리에서 반올림).

N개의 점수와 양쪽에서 제외하는 개수 K 값이 주어졌을 때 절사평균(N, K)와 보정평균(N, K)를 계산하는 프로그램을 작성하시오.

실행시간은 0.5초를 넘을 수 없다.

입력 형식

  • 첫째 줄에 전체 점수의 개수 N과 제외되는 점수의 개수 K가 빈칸을 사이에 두고 주어진다. N은 3 이상 100,000 이하의 자연수이다. K는 0 이상 (N/2)-1 이하로 주어진다.
  • 그 다음 N줄에는 각 심판의 점수가 한 줄에 하나씩 주어진다. 점수는 0 이상 10 이하의 실수로 소수점이하 첫째 자리까지 주어진다.

출력 형식

  • 첫째 줄에 절사평균(N, K)를,
  • 둘째 줄에 보정평균(N, K)를 각각 소수점이하 셋째 자리에서 반올림하여 둘째 자리까지 출력한다. 예를 들어 결과값이 9.667인 경우 9.67로, 5인 경우 5.00으로, 5.5인 경우에는 5.50으로 출력한다.

입력과 출력의 예

입력
7 2 
9.3 
9.5 
9.6 
9.8 
9.1 
5.0 
9.3 

출력 

9.37 

9.39 


출처:koi



KoiTrim.java


package kr.ac.hanbat;



import java.util.Arrays;

import java.util.Scanner;



public class KoiTrim {



	public static void main(String[] args) {



		Scanner sc = new Scanner(System.in);

		int judgmentNum;

		int exeptionNum;

		double[] score;

		

		System.out.println("입력하세요.");

		judgmentNum = sc.nextInt();

		exeptionNum = sc.nextInt();

		score = new double[judgmentNum];

		

		for(int i = 0; i < judgmentNum; i++) {

			score[i] = sc.nextDouble();

		}

		

		KoiTrimCalculation cal = new KoiTrimCalculation();

		

		//Arrays.sort(score);

		cal.sort(score, judgmentNum);

		cal.calculation1(judgmentNum, exeptionNum, score);

		cal.calculation2(judgmentNum, exeptionNum, score);

		

		sc.close();



	}



}








KoiTrimCalculation.java

package kr.ac.hanbat;



public class KoiTrimCalculation {



	public KoiTrimCalculation() {}

	

	void sort(double[] score, int length) {

		int center = length / 2;

		double leftNum[] = new double[center];

		double rightNum[] = new double[length - center];



		if (length == 1)

			return;



		for (int i = 0; i < center; i++) {

			leftNum[i] = score[i];

		}

		for (int i = 0; i < length - center; i++) {

			rightNum[i] = score[center + i];

		}



		sort(leftNum, leftNum.length);

		sort(rightNum, rightNum.length);



		merge(leftNum, rightNum, score);



	}



	void merge(double[] leftNum, double[] rightNum, double[] num) {

		int left = 0;

		int right = 0;

		int merge = 0;



		while (leftNum.length != left && rightNum.length != right) {

			if (leftNum[left] < rightNum[right]) {

				num[merge] = leftNum[left];

				merge++;

				left++;

			} else {

				num[merge] = rightNum[right];

				merge++;

				right++;

			}

		}



		while (leftNum.length != left) {

			num[merge] = leftNum[left];

			merge++;

			left++;

		}



		while (rightNum.length != right) {

			num[merge] = rightNum[right];

			merge++;

			right++;

		}



	}



	void calculation1(int num1, int num2, double[] score) {

		double sum = 0;

		double result = 0;



		for (int i = num2; i < (num1 - num2); i++) {

			sum += score[i];

		}

		

		result = sum / (num1 - (num2 * 2));

		String result2 = String.format("%.2f", result);

		System.out.println("절사평균 : " + result2);

	}



	void calculation2(int num1, int num2, double[] score) {

		double sum = 0;

		double result = 0;

		

		for (int i = 0; i < num2; i++) {

			score[i] = score[num2];

			

			score[(num1 - 1) - i] = score[(num1 - 1) - num2];

		}

		

		for (int i = 0; i < num1; i++) {

			sum += score[i];

		}

		

		result = sum / num1;

		String result2 = String.format("%.2f", result);

		System.out.println("보정평균 : " + result2);

	}



}










댓글0