(Java) 백준 25206번 - 너의 평점은

코딩너구리·2026년 1월 29일

코딩 문제 풀이

목록 보기
191/266

https://www.acmicpc.net/problem/25206

문제

> 인하대학교 컴퓨터공학과를 졸업하기 위해서는, 전공평점이 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인 과목은 계산에서 제외해야 한다.

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

접근

맵으로 학점 변환표를 미리 만들어둔다. 그럼 입력으로 등급이 들어오면 등급을 key값으로 가지는 value값이 실수형으로 반환된다.
총 20가지의 과목이므로 20번 StringTokenizer로 입력받고 과목명은 필요없으므로 st.nextToken()으로 한번 털어준다.
학점 입력받고 누적, 등급변환해서 학점과 곱해서 누적,
뒤의 값을 앞의 값으로 나눠 출력해준다.

문제해결

> Map grade로 문자열 key값, double형 value값을 가지도록 학점 변환표를 만든다.
> 20가지 과목을 입력받으며 과목명에 해당하는 token은 버리고 두번째 토큰을 num으로 학점에 저장한다.
> 세번째 토큰인 등급을 가져와 P과목인지 본다.
> F는 상관없지만 P라면 계산에서 빼기위해 continue로 넘어간다.
> 아닌 경우엔 총 학점의 수를 누적하고, 등급을 변환하여 점수와 학점을 곱한 값을 누적한다.
> sumgd값을 sum값으로 나누어 학점을 구해준다.

코드

import java.io.*;
import java.util.*;
import java.lang.*;

public class Main
{
    //25206번 너의 평점은
    static final Map<String, Double> grade = new HashMap<>();
    static
    {
        grade.put("A+", 4.5);
        grade.put("A0", 4.0);
        grade.put("B+", 3.5);
        grade.put("B0", 3.0);
        grade.put("C+", 2.5);
        grade.put("C0", 2.0);
        grade.put("D+", 1.5);
        grade.put("D0", 1.0);
        grade.put("F", 0.0);
    }
    public static void main(String[] args) throws IOException
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        double sum = 0, sumgd = 0;
        for(int i = 0; i < 20; i++)
        {
            StringTokenizer st = new StringTokenizer(br.readLine());
            st.nextToken();
            double num = Double.parseDouble(st.nextToken());
            String str = st.nextToken();

            if(str.equals("P")) continue;

            double gd = grade.get(str);
            sum += num;
            sumgd += num * gd;
        }
        System.out.printf("%.6f", sumgd/sum);
    }
}

후기

학점 변환을 스마트 하게하는 방법이 없을까 하다가 map으로 변환표를 만들어봤다. c++처럼 .second같이 쓰지않고 put과 get을 사용한다.
그리고 과목명을 안쓰고 싶어서 어떻게 할 까 하다가 그냥
st.nextToken을 쌩으로 사용하여 한번 버려버리면 된다는걸 알게 되었다.

0개의 댓글