문제
최백준이 이번 학기에 들은 과목과 학점 그리고 성적이 주어졌을 때, 평균 평점을 계산하는 프로그램을 작성하시오.
성적은 A+~F까지 총 13개가 있다.
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
평균 평점은 각 과목의 학점*성적을 모두 더한 뒤에, 총 학점으로 나누면 된다.
입력
첫째 줄에, 백준이가 이번 학기에 들은 과목 수가 주어진다. 둘째 줄부터 N개의 줄에 각 과목의 과목명, 학점, 성적이 주어진다. 과목명은 알파벳 소문자와 숫자, 그리고 밑줄 (_)로만 이루어져 있으며, 최대 100글자이고, 학점은 1보다 크거나 같고, 3보다 작거나 같은 자연수이다. 성적은 문제에 설명한 13가지 중 하나이다.
출력
첫째 줄에 평균 평점을 소수점 셋째 자리에서 반올림해서 둘째 자리까지 출력한다. (평균 평점이 1.5이면 1.50을 출력한다.)
예제 입력 1
7
General_Physics_1 3 A+
Introduction_to_Computer_Science_and_Eng 3 B0
Reading_And_Writing 2 C0
English_1 3 C+
Analytic_Geometry_and_Calculus_1 3 B+
Fortran_Programming 3 B+
C_Language_Programming 3 A+
예제 출력 1
3.28
🧒 나의 풀이
# 실패
dic={"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}
grade=input().split()
n=int(grade[0])
ans=0
num=0.0
for g in grade[1:] :
if g.isdigit() :
num=float(g)
elif g in dic : # 학점 찾기
ans+=num*dic[g]
num = 0.0
ans=float(ans/n)
print(ans)
답이 다르게 나오냐.. 학점으로 나눠야하는데 과목 수로 나눴구나...
알고보니 원문에서는 예제 입력이 줄 단위로 나누어져 있는데 복붙해서 형태가 바뀜 ㅎ
난 변형된 걸 기준으로 봤을 때 전체를 한꺼번에 입력 받는 줄 ㅠ 이상하게 짰다.
N=int(input()) # 과목 수
g=0 # 학점
ans=0 # 평점
grade={
"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
}
for _ in range(N) :
data=input().split()
g+=int(data[1]) # 총 학점
ans+=(int(data[1])*grade[data[2]]) # 학점*성적
print("{:.02f}".format(round(ans/g+(0.001 if ans/g*100%10 >= 5 else 0.000), 2)))
딕셔너리를 이용한 풀이
다른 사람의 풀이를 참고해서 완성
N개를 입력 받으면서 학점*성적을 평점 ans에 누적한다.
모든 과목을 학점*성적으로 계산한 ans를 총 학점으로 나눈다. *100하고 %10을 해서 소수점 셋째자리가 5 이상이면 반올림한 결과로 0.001을 더하고 5 미만이면 0.000을 더한다.
round로 둘째 자리까지 반올림
🏃♀️ 다른 사람 풀이
# https://jinho-study.tistory.com/671
d = {
"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
}
N=t=0
for _ in range(int(input())) : # 과목 수만큼
s, n, g=input().split() # 과목, 학점, 성적
n=int(n)
N+=n
t+=n*d[g] # 학점*성적
print("%.2f"%(round(t/N+10**-10, 2)))
변수명이 아쉽지만 출력 부분이 깔끔하다.
근데 무조건 0.001을 더하는 것은 아닌 것 같은데..🤔
d = {
"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
}
a=0
s=0
for _ in range(int(input())) :
L=input().split()
a+=int(L[1]) # 총 학점
s+=d[L[2]]*int(L[1])
print("%0.2f"%(round(s/a*100)/100))
반올림하는 부분을 정말 잘 처리했다.
100을 곱해서 소수점 셋째 자리에서 반올림한 후 100으로 나눠서 원래 값으로 만들었다.
문제 출처 💁♀️ 백준
'coding test' 카테고리의 다른 글
[파이썬] 2941. 크로아티아 알파벳 (0) | 2021.04.30 |
---|---|
[파이썬] 9012. 괄호 (0) | 2021.04.30 |
[파이썬] 2754. 학점계산 (0) | 2021.04.30 |
[파이썬] 11718. 그대로 출력하기 (0) | 2021.04.29 |
[파이썬] 1157. 단어 공부 (0) | 2021.04.28 |