백준 25206번 풀이

문제

전공평점 계산하는 문제. (소수점 6자리로 출력)

풀이

와 3.2… 나 3.0 안되는데 개부럽네… 아무튼… 이 문제 보자마자 뇌에서 블루스크린이 떴다면 정상이다. 나도 떴거든.

일단 전공 평점을 어떻게 구하는건가… 보니까 전공과목별 (학점 × 과목평점)의 합을 학점의 총합으로 나눈 값이라고 한다. 근데 예제가 20개라 감이 안 오니까 이걸 뭘 어쩌하는건가… 했다가… 결국 엑셀을 소환했음.

계산 과정

예제를 텍스트 파일로 저장한 다음 엑셀로 불러오면 이렇게 지가 알아서 나눠준다. 그리고 학점 변환하는 표도 가져오면 된다. 근데 P/F가 패스논패스인가? 패스논패스면 학점 저렇게 많이 안주던데… 울학교 채플이 패스논패스인데 학점 1학점임. 아, 모르셨군요. 세종대 미션스쿨임.

그러면 학점 표를 갖다가 A+ A0 이런걸 변환을 해 줘야 하는데 vlookup을 사용하면 된다. …정확히는 그것만 갖고 하면 P를 못 찾아서 오류가 나는데, 어차피 패스논패스는 계산에서 빠지니까 iferror로 공백 주면 된다. 즉, iferror(vlookup())으로 변환한거다.

P/F는 학점총계에서도 빼야 한다. 즉, 입력받는 과목의 학점이 P면 계산에서 아예 제한다. 근데 F면 짤없이 0점 주던데… 그건 둘째치고 패스논패스 과목은 출첵만 잘 해도 점수 거저 먹는건데 그걸 논패스를 떠? 이거 미쳤구만?

다시 풀이로

import sys

for i in range(20):
    gwamok, hakjeom, grade = sys.stdin.readline().split()

일단 입력을 받으면 전부 문자열이라 계산이 안되니까 hakjeom(학점)을 float로 바꿔주자. 왜 float냐면 예제에서 표기가 그랬어요…

import sys

total_grade = 0
total_hakjeom = 0

grade_list = ['A+',"A0","B+","B0","C+","C0","D+","D0","F"]
grade_point = [4.5,4.0,3.5,3.0,2.5,2.0,1.5,1.0,0.0]

for i in range(20):
    gwamok, hakjeom, grade = sys.stdin.readline().split()
    hakjeom = float(hakjeom)

뭐가 많이 늘었는데 이게 다 변환하는데 필요한건가요? 놉. 그건 밑에 float()에 있는거 하나다. total 어쩌고 변수는 나누기 할 숫자 계산할 변수다. total_grade에는 학점*평점(과목평점)이, total_hakjeom에는 학점총계가 들어간다. 밑에 있는 리스트는 일단 보다보면 뭔지 알게 될것이다.

for i in range(1):
    gwamok, hakjeom, grade = sys.stdin.readline().split()
    hakjeom = float(hakjeom)
    if grade in grade_list:
        print(grade_point[grade_list.index(grade)])

위에 있는 리스트 두 개는 문제에서 제시해준 학점 표를 배열로 만든 것이다. 그래서 입력받는 점수 중에 평점이 P가 아닌 과목들에 대해서 평점 목록의 인덱스 번호를 불러와서 평점 점수 리스트에서 그걸로 그대로 인덱싱할거다. 물론 print문이 들어간 건 테스트 차원에서 그런거고, 저렇게만 해두면 P가 들어왔을 때 미쳤습니까 휴먼? 할 수 있기 때문에 거기에 대한 처리도 해줘야 한다.

import sys

total_grade = 0
total_hakjeom = 0

grade_list = ['A+',"A0","B+","B0","C+","C0","D+","D0","F"]
grade_point = [4.5,4.0,3.5,3.0,2.5,2.0,1.5,1.0,0.0]

for i in range(2):
    gwamok, hakjeom, grade = sys.stdin.readline().split()
    hakjeom = float(hakjeom)
    if grade in grade_list:
        total_hakjeom += hakjeom
        total_grade += hakjeom * grade_point[grade_list.index(grade)]
    else: 
        continue

print(total_grade, total_hakjeom)

난 아직도 컨티뉴와 패스가 뭔 차이인지 모르겠음…

아무튼 반복문에서 컨티뉴는 다음 순번으로 넘어가라는 의미이다. 즉, 평점이 P이면 계산이고 뭐고 안 하니까 걍 다음걸로 넘어가게 되는거다. 20개의 과목을 입력한다 치면 1번부터 쭉 들어오는데, 그 중 10번 과목이 P이면 걍 11번 받으라는 얘기.

import sys

total_grade = 0
total_hakjeom = 0

grade_list = ['A+',"A0","B+","B0","C+","C0","D+","D0","F"]
grade_point = [4.5,4.0,3.5,3.0,2.5,2.0,1.5,1.0,0.0]

for i in range(20):
    gwamok, hakjeom, grade = sys.stdin.readline().split()
    hakjeom = float(hakjeom)
    if grade in grade_list:
        total_hakjeom += hakjeom
        total_grade += hakjeom * grade_point[grade_list.index(grade)]
    else: 
        continue

print(total_grade / total_hakjeom)

근데 생각해보니까 얘네 문제에서는 소수점 이하 6자리로 출력하라는 얘기 없었는데 출력이 소수점 여섯자리네?

import sys

total_grade = 0
total_hakjeom = 0

grade_list = ['A+',"A0","B+","B0","C+","C0","D+","D0","F"]
grade_point = [4.5,4.0,3.5,3.0,2.5,2.0,1.5,1.0,0.0]

for i in range(20):
    gwamok, hakjeom, grade = sys.stdin.readline().split()
    hakjeom = float(hakjeom)
    if grade in grade_list:
        total_hakjeom += hakjeom
        total_grade += hakjeom * grade_point[grade_list.index(grade)]
    else: 
        continue

total_grade = total_grade / total_hakjeom

print(f'{total_grade:.6f}')

는 이걸로 한방에 통과했구연.

참고로 졸업 요건은 학바학이긴 한데 보통 학점총계에 플러스 알파가 있다. 일단 우리학교는 평점 제한은 없었음. 나때는 120학점 이상(18학점 꾸준히 듣는다는 전제하에 4학년 2학기가 널럴해짐)+토익점수(대체과목 인정) 이렇게 있었는데 요즘은 토익 점수 커트라인도 올라가고 고전독서? 그것도 들어야 하는 모양임. 토익점수는 영문과가 더 높았던걸로 기억함.