백준 25206번(너의 평점은)

2025. 2. 10. 15:35백준

문제

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

 

치훈이의 전공평점을 계산해주는 프로그램을 작성해보자.

전공평점은 전공과목별 (학점 × 과목평점)의 합을 학점의 총합으로 나눈 값이다.

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

 

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


P/F 과목의 경우 등급이 P또는 F로 표시되는데, 등급이 P인 과목은 계산에서 제외해야 한다.

과연 치훈이는 무사히 졸업할 수 있을까?

입력

20줄에 걸쳐 치훈이가 수강한 전공과목의 과목명, 학점, 등급이 공백으로 구분되어 주어진다.

 

출력

치훈이의 전공평점을 출력한다.

정답과의 절대오차 또는 상대오차가
(10^{-4}) 이하이면 정답으로 인정한다.

 

나의 풀이

n = open(0)
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}
total_n =0
total_score=0
for i in n:
    tmp =i.strip('\n').split(' ')
    score = tmp[-1]
    unit = float(tmp[-2])

    if score == 'P':
        pass
    else:
        total_score +=graph[score] * unit
        total_n +=unit


print(total_score/total_n)

학점 계산기

  1. 전공 학점 = 학점 * 과목 평점
  2. 전공 평점 = sum(정공 학점들)/ 학점
  3. P가 학점으로 나올 경우 계산에서 제외
  4. 입력값에서 공백을 기준으로 마지막과 마지막-1에 등급과 학점이 계시

딕셔너리로 각 과목에 맞는 점수를 기입한다.
그 후 open(0)을 통해 받은 값에서 평점과 학점을 분리한다.

p인 경우를 따로 빼두고 계산하면 된다.

 

다른 사람의 풀이

n=s=0
for i in open(0):
    i=i.split();
    m=float(i[1])
 if'P'>i[2]:
     n+=m
     s+=m*"F   D0D+C0C+B0B+A0A+".find(i[2])/4
print(s/n)

 

 

if'P'>i[2]: 실제에서는 이렇게 쓰는 걸까? 그냥 if 'P' != i[2] '이게 더 편한거 아닌가?
전자는 A~F만 보고 후자는 P를 제외하고 보니 전자가 더 좋은 방법이다.

 

 

s+=m*"F D0D+C0C+B0B+A0A+".find(i[2])/4 처음 보는 방식이다.

문자: F \n\n \n D 0 D + C 0 C  +  B  0   B   + A   0   A   +
위치: 0  1 2  3 4 5 6 7 8 9 10 11 12 13  14 15 16  17  18  19

띄어쓰기는 보기 쉽게 \n으로 표기함

 

find()안에 있는 문자가 처음 등장하는 위치의 값을 반환한다.

ex A+라면 A와 +가 한데 묶이고 시작 값인 A가 처음 등장하는 18이 반환

거기에 나누기 4를 하면 우리의 표와 같은 값을 가진다.

후기

생각을 하고 풀어서 그런지 문제가 더 쉬운건지 모르겠지만 구현 자체는 빠르게 됐다.
풀던 중 학점 계산 방법에 대해 제대로 안 읽었던 것 빼고는 잘 돼서 만족했다.

 

다른 사람의 풀이를 보기 전까지는...
지금보니 'P' ==score 는 필요 없어보인다.

find() 위치와 관련된 문제에서는 독보적인 영향력을 가지고 있는 것 같다. 잘 기억해야지

반응형

'백준' 카테고리의 다른 글

백준 2566번(최댓값)  (0) 2025.02.19
백준 2738번(행렬 덧셈)  (0) 2025.02.18
백준 1316번 (그룹 단어 체커完)  (0) 2025.02.10
백준 1316번 (그룹 단어 체커2)  (0) 2025.02.07
백준 1316번 (그룹 단어 체커1)  (0) 2025.02.04