Coding Test/Baekjoon

[JAVA] 25306번 너의 평점은

gozer0 2024. 7. 15. 23:58

 

 

 

 

간단하게 풀겠다~ 했는데 

P를 계산에 포함하지 않게 하는걸 오래 고민했다.

그냥 단순하게 빼고 계산하면 되는거인데..!

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        double sum = 0;
        double creditsum = 0;

        for (int i = 0; i < 20; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            String sbj = st.nextToken();
            double credit = Double.parseDouble(st.nextToken());
            String grade = st.nextToken();

            if (!grade.equals("P")) { // "P"는 GPA 계산에 포함되지 않으므로
                creditsum += credit;
                switch (grade) {
                    case "A+":
                        sum += 4.5 * credit;
                        break;
                    case "A0":
                        sum += 4.0 * credit;
                        break;
                    case "B+":
                        sum += 3.5 * credit;
                        break;
                    case "B0":
                        sum += 3.0 * credit;
                        break;
                    case "C+":
                        sum += 2.5 * credit;
                        break;
                    case "C0":
                        sum += 2.0 * credit;
                        break;
                    case "D+":
                        sum += 1.5 * credit;
                        break;
                    case "D0":
                        sum += 1.0 * credit;
                        break;
                    case "F":
                        sum += 0;
                        break;
                    default:
                        throw new IllegalArgumentException("Invalid grade: " + grade);
                }
            }
        }

        if (creditsum > 0) {
            sum = sum / creditsum;
        } else {
            sum = 0;
        }

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

 

 

switch문을 사용했는데 비교 대상이 문자이기도 하고 오류 나기 좋아서

예외처리도 추가해주었다.

 

 

다른 방식도 찾아보았다.

스위치문으로 각 grade별 학점을 부여해 주는게 귀찮다면

아래와 같이 리스트를 사용하는 방법도 있다!

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        double sum = 0;
        double creditsum = 0;

        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};

        for (int i = 0; i < 20; i++) {
            String str = br.readLine();
            StringTokenizer st = new StringTokenizer(str);
            String sbj = st.nextToken();
            double credit = Double.parseDouble(st.nextToken());
            String grade = st.nextToken();

            for (int j = 0; j < gradeList.length; j++) {
                if (grade.equals(gradeList[j])) {
                    if (j != gradeList.length - 1) {
                        sum += gradeScore[j] * credit;
                        creditsum += credit;
                    }
                    break;
                }
            }
        }

        if (creditsum > 0) {
            double gpa = sum / creditsum;
            System.out.printf("%.6f%n", gpa);
        } else {
            System.out.println("0.000000");
        }
    }
}

 

 

이 코드는 배열을 사용해서

반복적으로 if-else 문을 사용하지 않고,

배열 인덱스를 사용하여 직접 접근하여

상수 시간(즉, O(1))에 접근할 수 있기 때문에 더 빠르다.

 

for (int j = 0; j < gradeList.length; j++) {
    if (grade.equals(gradeList[j])) {
        // 배열 인덱스를 사용하여 직접 접근
        break;
    }
}

 

 

배열은 순차 검색을 사용하여 인덱스를 빠르게 찾을 수 있기 때문에,

switch문이나 복잡한 if-else 문보다 직관적이고 효율적!

'Coding Test > Baekjoon' 카테고리의 다른 글

[JAVA] 2566번 최댓값  (0) 2024.07.22
[JAVA] 1316번 그룹 단어 체커  (0) 2024.07.16