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)
학점 계산기
- 전공 학점 = 학점 * 과목 평점
- 전공 평점 = sum(정공 학점들)/ 학점
- P가 학점으로 나올 경우 계산에서 제외
- 입력값에서 공백을 기준으로 마지막과 마지막-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 |