본문 바로가기
Java

[백준] 코딩테스트 문제 25206: 너의 평점은

by 리슈다 2026. 3. 3.

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

package baekjoon;
import java.util.*;
import java.io.*;
public class Main {
    public static void main(String[] args) throws IOException {
        //Main m = new Main();
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        double totalGrade = 0;
        double totalCredit = 0;
        double avg;
        int cnt = 0;
        for(int i = 0; i < 20; i++){
            StringTokenizer st = new StringTokenizer(br.readLine());
            String Subject = st.nextToken();
            double credit = Double.parseDouble(st.nextToken());
            String grade = st.nextToken();
            //double changeGrade = m.Grade(grade);
            double changeGrade = Grade(grade);
            if (changeGrade != -1){
                totalGrade = totalGrade + (credit * changeGrade);
                totalCredit = totalCredit + credit;
            }
        }

        avg = totalGrade / totalCredit;
        System.out.println(avg);
    }

    static public double Grade(String str){
        switch (str){
            case "A+":
                return 4.5;
            case "A0":
                return 4.0;
            case "B+":
                return 3.5;
            case "B0":
                return 3.0;
            case "C+":
                return 2.5;
            case "C0":
                return 2.0;
            case "D+":
                return 1.5;
            case "D0":
                return 1.0;
            case "F":
                return 0.0;
        }
        return -1;
    }
}

과목 평점을 점수로 변환하는 과정을 메서드로 만들어서 따로 빼줬는데

이 메서드를 main으로 불러올 때 

Main m = new Main() 으로 Main 내 객체를 생성한 뒤 m.Grade()로 불러와야 하는지,

아니면 Grade를 선언할 때 static을 붙여서 객체 생성할 필요 없이 바로 가져와야 하는지 구분이 안 가서 지피티한테 물어봄

명확하게 이해는 안 되지만 그렇다고 합니다.

그래서 지피티가 피드백 해준 코드는 무엇인가.

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

public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        double totalScore = 0.0; // 학점 * 과목평점 합
        double totalCredit = 0.0;

        for (int i = 0; i < 20; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            st.nextToken(); // subject (사용 안 함)
            double credit = Double.parseDouble(st.nextToken());
            String grade = st.nextToken();

            double point = gradeToPoint(grade);
            if (point >= 0) { // P 제외
                totalScore += credit * point;
                totalCredit += credit;
            }
        }

        System.out.println(totalScore / totalCredit);
    }

    static double gradeToPoint(String grade) {
        switch (grade) {
            case "A+": return 4.5;
            case "A0": return 4.0;
            case "B+": return 3.5;
            case "B0": return 3.0;
            case "C+": return 2.5;
            case "C0": return 2.0;
            case "D+": return 1.5;
            case "D0": return 1.0;
            case "F":  return 0.0;
            default:   return -1; // P 또는 기타
        }
    }
}

1. 변수/메소드 네이밍

- 메소드명은 보통 동사/소문자 시작: Grade -> gradeToPoint / toPoint

- 변수명도 소문자 시작: Subject -> subject(현재는 사용도 안 함;)

 

2. cnt 변수 안 쓰니까 제거

 

3. -1 매직넘버 대신 'P인지 직접 체크'

 

4. switch에서 default를 명시하면 더 안전

 

5. 출력 포맷

소수점 자리 지정하는 경우 유의

System.out.printf("%.6f%n", avg);