[백준/python] 25206 너의 평점은

joseon0thing·2023년 8월 8일
0

python

목록 보기
6/17
post-thumbnail


#for문으로 20번 입력
for i in range(1,20):
    while True: #입력을 다시 받기 위해 
        #공백으로 끊어 배열? 저장
        i = input().split(' ') #i = ['','','']
        
        #이름 조건
        if(len(i[0]) < 1 && len(i[0]) > 50):
            print("과목명은 한글자 이상이어야하며 50글자를 넘어가면 안됩니다.")
        #학점 조건
        if else (i[1] != 1.0 || i[1] != 2.0 || 
                 i[1] != 3.0 || i[1] != 4.0) :
            print("학점은 1.0,2.0,3.0,4.0중 하나입니다.")
        #등급 조건 / 대소문자 구분x
        if else (i[2].upper() != 'A+' || i[2].upper() != 'A0' || 
                 i[2].upper() != 'B+' || i[2].upper() != 'B0' ||
                 i[2].upper() != 'C+' || i[2].upper() != 'C0' ||
                 i[2].upper() != 'D+' || i[2].upper() != 'D0' ||
                 i[2].upper() != 'F' || i[2].upper() != 'P') :
            print("등급은 A+,A0,B+,B0,C+,C0,D+,D0,F,P중 하나입니다.")
        #이상하면 잘 못 입력됨. 입력으로 돌아가기
        #정상 입력
        else:
            break

#계산
#for문으로 돌림
for i in range (1, 20):
    #if문으로 등급을 숫자로 변경
    if(i[2].upper() == 'A+'):
        i[2] = 4.5
    else if(i[2].upper() == 'A0'):
        i[2] = 4.0
    else if(i[2].upper() == 'B+'):
        i[2] = 3.5
    else if(i[2].upper() == 'B0'):
        i[2] = 3.0
    else if(i[2].upper() == 'C+'):
        i[2] = 2.5
    else if(i[2].upper() == 'C0'):
        i[2] = 2.0
    else if(i[2].upper() == 'D+'):
        i[2] = 1.5
    else if(i[2].upper() == 'D0'):
        i[2] = 1.0
    else if(i[2].upper() == 'F'):
        i[2] = 0.0
    else if(i[2].upper() == 'P'):
        del i

    #학점x등급(숫자)의 합
    multi += i[1] * i[2]
    total += i[1]
    #최종 합을 학점의 총합으로 나눔
    grade = multi / total
    print(grade)

첫 번째 오류

컴파일 에러


수정해서 풀었으나
계속해서 컴파일 에러, 런타임 에러가 남

가독성이 좋지 않고 짧게 줄일 수 있을 거 같아
처음부터 다시 작성해봄


#20번의 과목, 학점, 등급 입력
#과목 평점 취환
#학점 x 과목평점의 합
#출력

#학점 총합
total = 0.0
#학점 x 과목평점의 합
sum = 0.0
#전공평점
#result = 0

#등급 변환
grade_graph = {'A+' : 4.5, 'A0' : 4.0, 'B+' : 3.5,
               'B0' : 3.0, 'C+' : 2.5, 'C0' : 2.0,
               'D+' : 1.5, 'D0' : 1.0, 'F' : 0.0 }
    
for _ in range(20):
    #과목, 학점, 등급
    sub, score, grade = input().split() 
    #학점 숫자 변환
    score = (float)score
     
    ##key값과 value값을 swap
    ##{v, k for k,v in grade.items()}
    ###zip함수를 이용해 swap
    #dict(zip(grade.values(), grade.keys())
    
    for i in grade_graph : #딕셔너리 요소 하나씩 가져옴
        if grade == i: #key값이 같다면
            grade = i.values() #value값으로 변경
    
    total += score #학점 총합
    sum += score * grade #학점, 과목평점 곱`합
    
result = sum / total
print(result)
#print(sum/total)

두 번째 오류

컴파일 에러

score = (float)score

강제 형변환하는 과정에서 에러가 난 거 같다.

--> python에서 형변환을 할 때는 score = float(score)으로 변수가 괄호 안으로 들어가야함


세 번째 오류

for i in grade_graph : #딕셔너리 요소 하나씩 가져옴
	if grade == i: #key값이 같다면
		grade = i.values() #value값으로 변경

런타임 에러

--> value 값으로 변경하면 for문을 나가게 break를 써보자


break를 쓰면 for문을 빠져나와 정상작동될 줄 알았는데 여전히 런타임에러

--> break를 유지한 채 딕셔너리 부분을 더 자세히 써보자 (key, value, item 사용)


런타임에러

for i in grade_graph.items() : #딕셔너리 key 하나씩 가져옴
	if grade == i.keys(): #key값이 같다면
		grade = i.values() #value값으로 변경
		break #딕셔너리 for문 종료

i는 str object로 인식돼 values값이 없음
따라서 key, value, item 사용은 안됨.

--> 딕셔너리는 처음 (고치기 전)으로 유지.
--> 딕셔너리는 value값을 가져올 때 dic[key]로 씀 (이를 사용해보자)


for i in grade_graph : #딕셔너리 key 하나씩 가져옴
	if grade == i: #key값이 같다면
		grade = grade_graph[i] #value값으로 변경
		break #딕셔너리 for문 종료

Colaboratory에서는 정상작동.
백준에서는 런타임에러

<의문점>

  • 백준에서는 왜 에러가 나는 지 모르겠음.
    --> (문제) 조건인 등급이 P일 때를 안 넣어서 오류가 남
if grade == 'P':
	continue

최종 코드

정상작동

#20번의 과목, 학점, 등급 입력
#과목 평점 취환
#학점 x 과목평점의 합
#출력

#학점 총합
total = 0.0
#학점 x 과목평점의 합
sum = 0.0
#전공평점
#result = 0

#등급 변환
grade_graph = {'A+' : 4.5, 'A0' : 4.0, 'B+' : 3.5,
               'B0' : 3.0, 'C+' : 2.5, 'C0' : 2.0,
               'D+' : 1.5, 'D0' : 1.0, 'F' : 0.0 }
    
for _ in range(20):
    #과목, 학점, 등급
    sub, score, grade = input().split() 
    #학점 숫자 변환
    score = float(score)
     
    ##key값과 value값을 swap
    ##{v, k for k,v in grade.items()}
    ###zip함수를 이용해 swap
    #dict(zip(grade.values(), grade.keys())

    if grade == 'P':
      continue
    
    for i in grade_graph : #딕셔너리 key 하나씩 가져옴
        if grade == i: #key값이 같다면
            grade = grade_graph[i] #value값으로 변경
            break #딕셔너리 for문 종료
    
    total += score #학점 총합math 3.0 A+
    sum += score * grade #학점, 과목평점 곱`합
    
result = sum / total
print(result)
#print(sum/total)

다른 사람들 코드

rate = 0
scoreSum = 0

rating = {"A+": 4.5, "A0": 4.0, "B+": 3.5, "B0": 3.0, 
          "C+": 2.5, "C0": 2.0, "D+": 1.5, "D0": 1.0, 
          "F": 0.0}

for i in range(20):
    subject, score, grade = input().split()
    
    if grade == "P":
        continue
    
    rate += float(score) * rating[grade]
    scoreSum += float(score)
    
print(rate/scoreSum)
  • score 형변환은 계산하면서 해줌 (코드 간결화)

  • 딕셔너리에서 key값을 대조하면서 볼 것이 아니라 해당 key의 value만 뽑아오면 됨.
    (나는 대조하면서 딕셔너리에서 key를 찾고 value를 뽑아옴)
    (위 코드는 바로 value를 뽑아옴)

profile
정리.velog

0개의 댓글