본문 바로가기

백준/Silver(1~5)

[백준]_18110번 : solved.ac(파이썬 and C언어)

728x90
반응형
 

18110번: solved.ac

5명의 15%는 0.75명으로, 이를 반올림하면 1명이다. 따라서 solved.ac는 가장 높은 난이도 의견과 가장 낮은 난이도 의견을 하나씩 제외하고, {5, 5, 7}에 대한 평균으로 문제 난이도를 결정한다.

www.acmicpc.net

백준에서 문제 난이도를 산정하는 방식에 대한 문제이다. 문제를 풀면서 가장 헷갈렸던 것은 코딩을 하다 보면 내림에 너무 익숙해져서 반올림이 그렇게 달갑지는 않았다. 이 문제는 아래의 규칙들만 지키면 된다.

  1. 의견이 없으면 0을 출력
  2. 모든 의견 중에서 난이도 하위 15%와 상위 15%를 제외하고 나머지 70%를 가지고 평균을 낸다.
  3. 단, 모든 결과는 반올림에 준한다(15% 산정, 평균).

전략

입력 받은 숫자들로 이루어진 배열을 오름차순으로 정렬한 후 위아래에서 제외할 대상의 수(전체 인원 n * 15% 의 반올림 값*2)만큼 배열에서 제외해 주고 평균을 계산해 준다. 

시도 1(Python)

import sys
input = sys.stdin.readline
def round2(num):
    return int(num)+(1 if num-int(num)>=0.5 else 0)
human=int(input())
ls=[]
for _ in range(human):
    ls.append(int(input()))
if len(ls)==0:
    print(0)
else:
    rm=round2(human*0.15)
    ls.sort()
    ls=ls[rm:human-rm]
    print(round2(sum(ls)/len(ls)))

<해석>

파이썬에 이미 round가 있는데 왜 반올림 처리 round2를 또 만들었는가? 그것은 파이썬 자체에 있는 어처구니 없는 이유 때문이다. 파이썬은 round(x.5)를 계산할 때 우리의 직관대로라면 x+1을 반환해야 한다. 하지만 이때 round(x.5)는 반드시 짝수를 반환한다. 따라서 x가 짝수냐 홀수냐에 따라 출력이 달라지는 것이다. 따라서 이 문제를 해결하기 위해 새로운 round함수(round2)를 만들었다.   


시도 2(C언어)

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int compareDesc(const void *a, const void *b) {
    return (*(int *)a - *(int *)b);
}
int main() {
    int size;
    scanf("%d",&size);
    if(size==0) printf("0");
    else{
        int* arr=(int*)malloc(size*sizeof(int));
        for(int i=0;i<size;i++)
            scanf("%d",&arr[i]);

        qsort(arr, size, sizeof(int), compareDesc); //# 오름차순으로 정렬. 하위, 상위 15%를 걸러야 하기 때문 

        int rm=int(round((double)(size*3)/20));
        int sum=0;

        for(int i=rm;i<size-rm;i++)
            sum+=arr[i];

        int avg=int(round((double)sum/(size-2*rm)));
        printf("%d",avg);
        free(arr);
        }
    return 0;
}

파이썬과 비교해서 크게 다를 것은 없다고 본다.

 

728x90
반응형