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

조선영·2023년 8월 8일
0

python

목록 보기
6/27
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
UX 기획도 하고 서비스 기획도 하고 PM도 하고 프론트도 하고 PL도 하는 중

0개의 댓글