과목, 학점, 성적이 주어질 때,
주어진 식에 따라 평균 평점을 계산하는 문제이다.
과목은 필요한 정보가 아니므로,
split()을 통해 학점과 성적만 사용하면 된다.
그리고 'A+'와 같은 성적을 실수 값 형태의 성적으로 바꾸는 것은,
딕셔너리를 사용하면 쉽게 변환 가능하다.
그래서 총 학점 수와 학점 * 성적의 합을 구한 뒤..
내장 함수 round()나 포맷팅을 활용해서 ".2f" 꼴로 평균 학점을 출력하면 된다고 생각했다.
그런데 이런 흐름으로 이 문제를 풀면..
파이썬의 반올림 구현이 우리가 일반적으로 생각하는 반올림과 다른 것에서 문제가 생긴다.
우리가 일반적으로 생각하는 반올림은 사사오입으로,
4 이하의 숫자는 버리고, 5 이상의 숫자는 올린다.
반면 파이썬의 반올림 구현은 기본적으로 오사오입이다.
반올림 하고자 하는 자리의 값이 5일 때,
앞자리가 홀수이면 올리고, 앞자리가 짝수면 버리는 것이다.
결국 반올림 하고자 하는 자리의 값이 5일 때가 문제인 것이므로..
이 경우 사사오입 형태로 반올림이 되도록 값을 수정해서 문제를 풀었다.
예를 들어 평균 평점이 3.275일 때,
우리가 생각하는 문제의 정답은 3.28이지만,
파이썬 내장 함수나 포맷팅을 사용한 결과는 3.27이다.
따라서 평균 평점에 100을 곱하고,
여기에 0.5를 더한 다음 int()를 통해 소수 셋째 자리 이후의 숫자는 초기화했다.
그리고 다시 100으로 나누어 정답을 구했다.
이렇게 계산을 하면,
반올림 하고자 하는 자리의 값이 5일 때,
사사오입 형태로 반올림이 된다.
코드(정답)는 다음과 같다.
# 2755
import sys
grade_conversion = {
'A+': 4.3, 'A0': 4.0, 'A-': 3.7,
'B+': 3.3, 'B0': 3.0, 'B-': 2.7,
'C+': 2.3, 'C0': 2.0, 'C-': 1.7,
'D+': 1.3, 'D0': 1.0, 'D-': 0.7,
'F': 0.0
}
subjects = int(sys.stdin.readline())
ratings = 0 # 학점 합
grades = 0 # 성적 합
for _ in range(subjects):
subject = list(sys.stdin.readline().rstrip().split())
grades += int(subject[1])
ratings += (int(subject[1]) * grade_conversion[subject[2]])
average_rating = ratings / grades
rounded_average_rating = int((average_rating * 100) + 0.5) / 100
print("%.2f" % rounded_average_rating)
또 다른 방법으로는 적당히 작은 값을 평균 평점에 더해준 뒤,
round()를 이용하는 것이다.
논리보다는 야매의 느낌이 나서 위의 풀이를 택했지만,
average_rating에 10 ** (-10)을 더한 뒤 round()로 문제를 해결한 분이 많았다.