coding test

[파이썬] 이번학기 평점은 몇점?

잔망루피 2021. 4. 30. 09:54

문제

최백준이 이번 학기에 들은 과목과 학점 그리고 성적이 주어졌을 때, 평균 평점을 계산하는 프로그램을 작성하시오.

성적은 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