728x90
반응형
백준에서 문제 난이도를 산정하는 방식에 대한 문제이다. 문제를 풀면서 가장 헷갈렸던 것은 코딩을 하다 보면 내림에 너무 익숙해져서 반올림이 그렇게 달갑지는 않았다. 이 문제는 아래의 규칙들만 지키면 된다.
- 의견이 없으면 0을 출력
- 모든 의견 중에서 난이도 하위 15%와 상위 15%를 제외하고 나머지 70%를 가지고 평균을 낸다.
- 단, 모든 결과는 반올림에 준한다(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
반응형
'백준 > Silver(1~5)' 카테고리의 다른 글
[백준]_9020번 : 골드바흐의 추측(파이썬 and C언어) (0) | 2023.07.31 |
---|---|
[백준]_1676 : 팩토리얼 0의 개수(파이썬 and C언어) (0) | 2023.07.30 |
[백준]_10610번 : 30(파이썬 and C언어) (0) | 2023.07.28 |
[백준]_9461번 : 파도반 수열(파이썬 and C언어) (0) | 2023.07.28 |
[백준]_1064번 : 평행사변형(파이썬 and C언어) (2) | 2023.07.27 |