2월14일 절사평균

125 views
Skip to first unread message

cybe...@gmail.com

unread,
Feb 14, 2013, 2:45:01 AM2/14/13
to kor...@googlegroups.com
프로그램 명: koi_trim
제한시간: 1 초

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

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

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
Message has been deleted
Message has been deleted
Message has been deleted

권기륜

unread,
Feb 14, 2013, 3:51:58 AM2/14/13
to kor...@googlegroups.com
import java.util.Arrays;
import java.util.Scanner;
public class Koi_trim {
public static void main(String[] args) {

int i;
int N,K;
double a=0,b=0;

Scanner sc=new Scanner(System.in);
N=sc.nextInt();
K=sc.nextInt();

double[] arr=new double[N];

for(i=0;i<N;i++){
arr[i]=sc.nextDouble();
}
Arrays.sort(arr);

for(i=K;i<N-K;i++){
a=a+arr[i];
}
System.out.printf("%.2f",a/(N-2*K));
System.out.println();

for(i=0;i<K;i++){
arr[i]=arr[K];
}
for(i=N-K;i<N;i++){
arr[i]=arr[N-K-1];
}
for(i=0;i<N;i++){
b=b+arr[i];
}
System.out.printf("%.2f",b/N);
}

}

선해

unread,
Feb 14, 2013, 7:13:25 PM2/14/13
to KorUsn
import java.util.Scanner;

//절사평균, 보정평균 구하기
public class Test4 {
public static void main(String[] arg){
Scanner sc = new Scanner(System.in);

int N=sc.nextInt(), K=sc.nextInt();

double[] score = new double[N];
double average1=0, average2=0;

for(int i=0; i<score.length; i++)
score[i] = sc.nextDouble();

for(int j=0; j<score.length; j++){ //값이 작은 순서대로 정렬
for(int i=1; i<score.length; i++){
double buf;
if(score[i-1]>score[i]){
buf = score[i-1];
score[i-1] = score[i];
score[i] = buf;
}
}
}

for(int i=K; i<score.length-K; i++)
average1 += score[i];

System.out.printf("%.2f",average1/(score.length-K*2)); //절사평균
System.out.println();

for(int i=0; i<K; i++)
score[i] = score[K];
for(int i=N-K; i<N; i++)
score[i] = score[N-K-1];

for(int i=0; i<score.length; i++)
average2 += score[i];

System.out.printf("%.2f",average2/(score.length)); //보정평균

}
}

cybe...@gmail.com

unread,
Feb 14, 2013, 9:35:15 PM2/14/13
to kor...@googlegroups.com
public class business {

public static void main(String[] args) {
/*
* 데이터 입력구분 (N = 입력 받을 데이터 수 K = 데이터를 자를 개수
* N만큼 데이터 입력받음
*/
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int K = sc.nextInt();
double a[] = new double[N];
for (int i = 0; i < N; i++) {
a[i] = sc.nextDouble();
}
/*
* 클래스 선언 후 퀵소트 메소드 실행(정렬)
*/
business bu = new business();
bu.quicksort(a, 0, N-1);
//양쪽 K만큼 데이터를 제외하고 양쪽 끝에서 남은 점수 중 가장 가까운 것으로 교체
double sum = a[K];
double sum1 = a[N-K-1];
for (int i = 0; i < K; i++) {
a[i] = sum;
a[(N - i-1)] = sum1;  
}
double jj  = 0.00; //보정에 쓰일 총 값 저장 변수
double jj2  = 0.00; //절사에 쓰일 총 값 저장변수
for (int i = 0; i < N; i++) {
if((i>=K && i<=N-K-1)){//양쪽 K만큼 데이터를 제외한
jj2 += a[i];
}
jj += a[i];
}
//출력
System.out.printf("%.02f\n",jj2/(N-K-K));
System.out.printf("%.02f",jj/N);
}
/**
* 퀵 정렬
* @param data 정렬 시킬 데이터
* @param left Left시작점
* @param right Right 시작점
* @return 정렬된 데이터
*/
public double[] quicksort(double[] data, int left, int right){
double pivot; //기준점
double num; //데이터 교환에 쓰일 변수
int i,j; //반복문에 쓰일 변수
if(left < right) /*1*/
{
i= left; j = right+1;
pivot = data[left];
while(true) /*2*/
{
//앞에서 기준점보다 큰 값을 찾는다. 
do
++i;
while(i <= right && data[i]<pivot );  /*3*/
//뒤에서 기준점보다 작은 값을 찾는다.
while(data[--j]>pivot);  /*4*/
//i가 j보다 작을 경우 두 값을 바꾼다.
if(i < j){
num = data[i];
data[i] = data[j];
data[j]= num;
}
//i가 j보다 같거나 클 경우 반복문을 종료한다.
if(!(i<j))break;
}
num = data[left];
data[left] = data[j];
data[j]= num;
//앞에서부터 j-1만큼의 데이터를 정렬한다.
quicksort(data, left, j-1); //재귀적인 방법(C의 재귀함수)
//j+1에서부터 끝에까지의 데이터를 정렬 한다.
quicksort(data, j+1, right);//재귀적인 방법
}
return data;
}
}

qgqg...@gmail.com

unread,
Feb 14, 2013, 10:04:45 PM2/14/13
to kor...@googlegroups.com
import java.util.Scanner;
import java.util.Arrays;

public class Main {

 public static void main(String[] args) {
  Scanner sc = new Scanner(System.in);
  int N, K;
  int i;
  double ave = 0;
  double ave2 = 0;
  double tot = 0;
  double tot2 = 0;

  N = sc.nextInt();
  K = sc.nextInt();

  double num[] = new double[N];
  double avg[] = new double[N - (K * 2)];

  for (i = 0; i < N; i++) {// for start
   num[i] = sc.nextDouble();
  }
  Arrays.sort(num);

  for (i = 0; i < avg.length; i++) {
   avg[i] = num[i + K];
   tot += avg[i];
  }
  ave = tot / avg.length;

  for (i = 0; i < K; i++) {
   num[i] = num[K];
  }
  for (i = (N - 1); i > (N - 1) - K; i--) {
   num[i] = num[(N - 1) - K];
  }
  for (i = 0; i < num.length; i++) {
   tot2 += num[i];
  }
  ave2 = tot2 / num.length;

  System.out.format("%.2f%n", ave);
  System.out.format("%.2f%n", ave2);
 }
}

경과시간별 순위:

    전체: 70/77
    Java :2/8

코드size 순위:

    전체:67/77
    Java:6/8

BAE, JUNGWON

unread,
Feb 15, 2013, 6:21:10 AM2/15/13
to kor...@googlegroups.com
import java.util.Arrays;
import java.util.Scanner;

public class Main {
public static void main(String[] args) {
int N, K;
double sum1 = 0, sum2 = 0;
double[] judges;

Scanner sc = new Scanner(System.in);
N = sc.nextInt();
K = sc.nextInt();

judges = new double[N];

for (int i = 0; i < N; i++) {
judges[i] = sc.nextDouble();
}

//입력된 값을 소트
Arrays.sort(judges);

// 순차적으로 정렬된 값을 K수만큼 앞뒤로 잘라내고 합계
for (int i = 0; i < judges.length; i++) {
if (i > K - 1 && i < judges.length - K) {
sum1 = sum1 + judges[i];
}
}
// 절사평균
System.out.println(String.format("%.2f", sum1 / (N - (K * 2))));

// 앞뒤 K와 가까운 수로 값을 채우고 합계
for (int i = 0; i < judges.length; i++) {
if (i < K) {
judges[i] = judges[K];
}
if (i > judges.length - (K + 1)) {
judges[i] = judges[judges.length - K - 1];
}
sum2 = sum2 + judges[i];
}
// 보정평균
System.out.println(String.format("%.2f", sum2 / N));
}
}

Message has been deleted
Message has been deleted
Message has been deleted
Message has been deleted

Changshik Min

unread,
Feb 16, 2013, 5:17:20 AM2/16/13
to kor...@googlegroups.com
import java.util.Scanner;

public class Koi_trim_final {

public static void main(String[] args) {
//변수선언 및 초기값 입력
int n, k, j;
double score, sum1, sum2, ave1, ave2;
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
k = sc.nextInt();

//점수입력
double[] arr1 = new double[n];
for (int i = 0; i < n; i++) {
score = sc.nextDouble();
if (score >= 0 && score <= 10) {
arr1[i] = score;
}
}

//정렬
double[] arr2 = new double[n];
int h = 0;
for (int i = 0; i <= 100; i += 1) {
for (j = 0; j < n; j++) {                
if (arr1[j] * 10 - i == 0)
arr2[h++] = arr1[j];
}
}     

//절사평균
sum1 = 0;
for (j=0, j += (k); j < n - k; j++)
sum1 += arr2[j];
ave1 = sum1 / (n - 2 * k);
System.out.format("%.2f%n", ave1);

//보정평균
sum2 = 0;
for (j = 0; j < k; j++)
arr2[j] = arr2[k];
for (j = n - 1; j >= n - k; j--)
arr2[j] = arr2[n - 1 - k];
for (j = 0; j < n; j++)
sum2 += arr2[j];
ave2 = sum2 / n;
System.out.format("%.2f%n", ave2);
}
}

Reply all
Reply to author
Forward
0 new messages