2023. 6. 16. 16:03ㆍ알고리즘
https://www.acmicpc.net/problem/18110
처음에는 이렇게 풀었다.
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)
나참 ㅋ 이런 경우도 있다는 걸 또 배워갑니다
'알고리즘' 카테고리의 다른 글
[Python] 백준 2785_체인 : 그리디 (0) | 2023.07.04 |
---|---|
[Python] 백준 2012_등수 매기기 : 그리디 (0) | 2023.07.04 |
[후기] 2023 우리코딩페스티벌 후기 (2) | 2023.06.10 |
[Python] 최대공약수와 최소공배수 - 유클리드 호제법 (0) | 2023.04.24 |
[Python] 백준 5525 IOIOI_문자열 (0) | 2023.03.28 |