[Python] 백준 18110_solved.ac

2023. 6. 16. 16:03알고리즘

 

https://www.acmicpc.net/problem/18110

 

18110번: solved.ac

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

www.acmicpc.net

 

처음에는 이렇게 풀었다.

import sys

n = int(sys.stdin.readline().rstrip())
level = []
for _ in range(n):
    level.append(int(sys.stdin.readline().rstrip()))
level.sort()

idx = round(n * 0.15)
cnt = n - (2 * idx)

if cnt <= 0:
    print(0)
else:
    total = 0
    for i in range(idx, n - idx):
        total += level[i]

    answer = round(total / cnt)
    print(answer)

1. 전체 인원의 15%를 구해 위아래 제외할 인원 수를 구하고 (idx)

2. 평균을 낼 인원 수를 구했다. (cnt = 전체 인원 n - 2 * idx)

3.1 그리고 평균을 낼 인원수가 0명이라면,,, 난이도는 0이고

3.2 위아래 15% 제외한 인원으로 평균을 내서, round() 함수를 이용해 반올림했다.

왜 이래용 ㅠ 😩

 

반례 찾기

8
0
0
0
1
2
0
0
7

위와 같은 값을 input으로 줬을 때,

8개의 15%는 1.2 이므로, 위 아래로 1명씩 제외한 6개의 난이도에 대해서만 평균을 구해야한다.

0 0 0 0 1 2  의 평균을 구하게 되므로, => 1 + 2 / 6 = 0.5 이라는 평균이 나온다.

따라서 0.5를 반올림하면 1이므로 output으로 1이 나와야한다.

 

하지만 위의 코드를 돌려보면 output으로 0이 나온다.

이건 파이썬 내장함수인 round 함수 때문이다..!

 

파이썬 내장함수 round(num)

print(round(0.5))   # 0
print(round(1.5))   # 2
print(round(2.5))   # 2
print(round(3.5))   # 4
print(round(4.5))   # 4
print(round(5.5))   # 6
print(round(6.5))   # 6

희한하다. ㅋ

반올림하려는 위치의 앞자리가 홀수인 경우에는 올림을 하고, 짝수인 경우엔 내림을 하고 있는 것을 확인할 수 있다.

 

⭐️ 파이썬의 반올림(round함수)은 반올림 하려는 수가 올림, 내림했을  동일하게 차이가 나는 경우(=0.5)에는 짝수 값으로 반올림한다.

(파이썬의 부동소수점 오류 때문이라고 한다 : https://docs.python.org/ko/3/tutorial/floatingpoint.html)

 

따라서!!!!

0.5일 때, 올림하는 round 함수를 별도로 선언해서 사용해야 한다.

(사사오입 : 넷 이하는 버리고 5 이상은 열로 올려 원자리로 끌어올려 계산하는 방법)


최종 소스

import sys

def new_round(num):
    return int(num) + 1 if num - int(num) >= 0.5 else int(num)


n = int(sys.stdin.readline().rstrip())
level = []
for _ in range(n):
    level.append(int(sys.stdin.readline().rstrip()))
level.sort()
idx = new_round(n * 0.15)
cnt = n - (2 * idx)

if cnt <= 0:
    print(0)
else:
    total = 0
    for i in range(idx, n - idx):
        total += level[i]

    answer = new_round(total / cnt)
    print(answer)

나참 ㅋ 이런 경우도 있다는 걸 또 배워갑니다