[BackJoon] 25206번 너의 평점은

KyeongHun Kim·2024년 1월 4일

Coding Test 연습

목록 보기
2/14

문제

인하대학교 컴퓨터공학과를 졸업하기 위해서는, 전공평점이 3.3 이상이거나 졸업고사를 통과해야 한다. 그런데 아뿔싸, 치훈이는 깜빡하고 졸업고사를 응시하지 않았다는 사실을 깨달았다!

치훈이의 전공평점을 계산해주는 프로그램을 작성해보자. 전공평점은 전공과목별 (학점 × 과목평점)의 합을 학점의 총합으로 나눈 값이다.

P/F 과목의 경우 등급이 P또는 F로 표시되는데, 등급이 P인 과목은 계산에서 제외해야 한다. 과연 치훈이는 무사히 졸업할 수 있을까?

인하대학교 컴퓨터공학과의 등급에 따른 과목평점은 다음 표와 같다.

평점학점
A+4.5
A04.0
B+3.5
B03.0
C+2.5
C02.0
D+1.5
D01.0
F0.0

제한사항

  • 1 ≤ 과목명의 길이 ≤ 50
  • 과목명은 알파벳 대소문자 또는 숫자로만 이루어져 있으며, 띄어쓰기 없이 주어진다. 입력으로 주어지는 모든 과목명은 서로 다르다.
  • 학점은 1.0,2.0,3.0,4.0중 하나이다.
  • 등급은 A+,A0,B+,B0,C+,C0,D+,D0,F,P중 하나이다.
  • 적어도 한 과목은 등급이 P가 아님이 보장된다.

풀이

  1. 전공평점은 전공과목별 (학점 × 과목평점)의 합을 학점의 총합으로 나눈 값이다.
  2. 계산과정에서 필요없는 정보인 과목명을 처리해야한다.
  3. 문자열로 제시된 과목평점을 그것에 맞는 실수로 치환하여 계산해야 한다.

첫번째 제출

data = [] # 과목명, 학점, 평점이 저장되는 리스트
for _ in range(20): # 반복문을 통해 데이터가 입력됨
    grade = input()
    data.append(grade)

# 문자열로 표현된 과목평점을 실수로 변환하기 위해 dictionary로 정의
grade_score = {'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}

score_list = [] # 각 과목별 평점을 추가할 리스트
total_credit_score = 0 # 학점의 총합
for i in range(len(data)): # 반복문으로 입력된 데이터를 처리함.
    if data[i][-1] == 'F': # 학점이 F인 경우(한글자인 경우)
        credit_score = float(data[i][-5:-2])
        GPA = grade_score[data[i][-1]]
        total_score = credit_score * GPA
        total_credit_score += credit_score
        score_list.append(total_score)

    elif data[i][-1] == 'P': # 학점이 P인 경우에는 계산을 진행하지 않음.
        continue
    else:
        credit_score = float(data[i][-6:-3])
        GPA = grade_score[data[i][-2:]]
        total_score = credit_score * GPA
        total_credit_score += credit_score
        score_list.append(total_score)

print(sum(score_list) / total_credit_score)

문제점

  1. 전혀 파이썬스럽지 않음 → 단순하지 못하고 코드를 읽기 불편함.

새로운 풀이

# match - case 구문을 활용한 간단한 방법
total_credit_score = 0 # 학점의 총합
total_score = 0 # 학점 * 과목 평점

for _ in range(20): # 20개 과목 입력
    _, credit, grade = input().split() # 띄어쓰기를 기준으로 제시된 데이터를 split()으로 간단히 처리
    credit = float(credit) # 학점 계산을 위해 실수형으로 변환
    if grade == 'P':
        continue
    match grade:
        case 'A+': grade = 4.5
        case 'A0': grade = 4.0
        case 'B+': grade = 3.5
        case 'B0': grade = 3.0
        case 'C+': grade = 2.5
        case 'C0': grade = 2.0
        case 'D+': grade = 1.5
        case 'D0': grade = 1.0
        case 'F': grade = 0.0
    total_credit_score += credit
    total_score += credit * grade
print(total_score / total_credit_score) # (학점 * 과목 평점) / 학점의 총합
profile
기본에 충실하자!

0개의 댓글