[Python] BOJ 18110 - solved.ac

728x90
반응형

www.acmicpc.net/problem/18110

 

18110번: solved.ac

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

www.acmicpc.net

쉬운 문제이지만, 파이썬의 허점(?)을 알 수 있는 문제였다..

파이썬은 다른 언어와 다르게 반올림을 할 때 사사오입이 아닌 오사오입이다.

www.omnibuscode.com/board/board_devcommon/43652

 

OMNIBUSCODE [개발상식] - 반올림하는 두 가지 방법 (Round-off(사사오입), Round-to-nearest-even(오사 오입))

1. 근사값 처리 방법 관련 문서: 수학 관련 정보 Round-off 근사값(어림수)을 구할 때에 끝수를 처리하는 방법으로, 수학적으로 말하자면 최소 단위로 나눈 나머지가 최소 단위의 절반에 미치지 못

www.omnibuscode.com

따라서 그냥 내장함수 round를 사용하면 틀리게 되고 사사오입으로 반올림하는 함수를 따로 만드는 등 다른 방법을 사용해야 한다.

(오사오입을 적용하면 2.5를 반올림하면 3이 아니라 2가 출력된다)

 

사사오입을 하는 방법엔 여러가지가 있는데, 3가지만 소개하겠다.

 

1. 밑에 round2함수처럼 사사오입을 하는 함수를 만든다.

 

2. 반올림하고자 하는 수에 0.5를 더한 뒤, int형으로 바꿔 소수점을 버린다.

 

3. 반올림하고자 하는 수에 미세한 값(ex: 0.000000001)을 더해준 뒤 round함수를 사용한다.

import sys
from collections import deque
input = sys.stdin.readline
def round2(n):
	return int(n) + 1 if n - int(n) >= 0.5 else int(n)
difficulty = []
n = int(input())
for _ in range(n):
	difficulty.append(int(input()))
if n == 0:
	print(0)
else:
	remove = round2(n * 15 / 100)
	difficulty.sort()
	difficulty = deque(difficulty)
	for i in range(remove):
		difficulty.popleft()
		difficulty.pop()
	print(round2(sum(difficulty) / (n - 2 * remove)))

 

문제가 쉬우니 코드설명은 간단하게 하겠다.

 

1. difficulty배열에 난이도를 입력받고 위아래 15%를 제거해야하므로 remove에 15%에 해당하는 수를 저장한다.

2. difficulty배열을 정렬한 뒤 deque로 만든다(deque는 sort함수를 못 써서 이렇게 했다.)

3. remove만큼 위아래로 짤라야하므로 popleft()와 pop()을 해 준 뒤, 평균을 출력한다.

728x90
반응형

'문제풀이 > BaekjoonOnlineJudge' 카테고리의 다른 글

[Python] BOJ 3190 - 뱀(zmija)  (0) 2021.04.14
[Python] BOJ 2589 - 보물섬  (0) 2021.04.13
[Python] BOJ 14676 - 영우는 사기꾼?  (0) 2021.04.04
[Python] BOJ 2252 - 줄 세우기  (0) 2021.04.04
[Python] BOJ 11946 - ACM-ICPC  (0) 2021.04.01
TAGS.

Comments