#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에서는 정상작동.
백준에서는 런타임에러
<의문점>
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를 뽑아옴)