[Java] 백준 #25206 너의 평점은

Kitsun3·2025년 1월 20일


처음풀이

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

public class Main {

    public static void solution() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String str[] = new String[20];
        String gradeList[] = {"A+", "A0", "B+", "B0", "C+", "C0", "D+", "D0", "F", "P"};
        double gradeScore[] = {4.5, 4.0, 3.5, 3.0, 2.5, 2.0, 1.5, 1.0, 0.0, 0.0};

        double totalSum = 0;
        double scoreSum = 0;

        for (int i = 0; i < 20; i++) {
            str[i] = br.readLine(); // 한 줄 입력 받고
            StringTokenizer st = new StringTokenizer(str[i], " ");  
            String subject = st.nextToken(); // 과목명
            double score = Double.parseDouble(st.nextToken()); // 학점
            String grade = st.nextToken(); // 점수

            for (int j = 0; j < 10; j++) {
                if (grade.equals(gradeList[j])) {
                    totalSum += score * gradeScore[j];
                    if (j != 9) {   // Pass 과목 총 학점에서 제외
                        scoreSum += score;
                    }
                }
            }
        }

        double average = totalSum/scoreSum;
        System.out.printf("%.6f\n", average);
        br.close();

    }

    public static void main(String[] args) throws IOException {
        solution();
    }
}

학점과 성적을 담을 리스트를 만들고 20줄의 입력을 받기위한 반복문을 작성했다.
StringTokenizer 을 이용해 공백을 기준으로 구분 후 과목명, 학점, 점수를 분리해 계산했다.


💡 문제점

학점과 성적을 매핑하는데 리스트를 사용해서 코드가 복잡해보였다.

또한 반복문이 두 번 들어가서 불필요하게 보였다.


최종풀이

import java.io.*;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;

public class Main {

    private static final int SUBJECT_COUNT = 20;

    public static void solution() throws IOException {
        Map<String, Double> gradeMap = new HashMap<>();
        gradeMap.put("A+", 4.5);
        gradeMap.put("A0", 4.0);
        gradeMap.put("B+", 3.5);
        gradeMap.put("B0", 3.0);
        gradeMap.put("C+", 2.5);
        gradeMap.put("C0", 2.0);
        gradeMap.put("D+", 1.5);
        gradeMap.put("D0", 1.0);
        gradeMap.put("F", 0.0);
        gradeMap.put("P", 0.0);

        double totalSum = 0.0; // 총 점수 (학점 * 성적)
        double scoreSum = 0.0; // 총 학점

        try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
            for (int i = 0; i < SUBJECT_COUNT; i++) {
                String line = br.readLine();
                StringTokenizer st = new StringTokenizer(line, " ");

                String subject = st.nextToken(); // 과목명
                double score = Double.parseDouble(st.nextToken()); // 학점
                String grade = st.nextToken(); // 성적

                double gradeValue = gradeMap.get(grade);
                totalSum += score * gradeValue;

                if (!grade.equals("P")) {
                    scoreSum += score;
                }
            }
        }

        double average = totalSum / scoreSum;
        System.out.printf("%.6f\n", average);
    }

    public static void main(String[] args) throws IOException {
        solution();
    }
}

개선방향

HashMap을 사용해 성적과 점수를 매핑하여 가독성과 효율성을 높였다.

BufferdReader 사용시 명시적으로 close() 사용하는 대신 try-with-resources를 사용해 자원 관리를 간소화했다.
(이 부분은 나중에 따로 다뤄 보도록 하겠다.)

또한 상수를 사용해 가독성과 유지보수성을 향상했다.

profile
HELLO

0개의 댓글