Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags more
Archives
Today
Total
관리 메뉴

luke

[백준] - 학점계산프로그램 (29614) (자바/Java) 본문

알고리즘문제/백준 문제(Java)

[백준] - 학점계산프로그램 (29614) (자바/Java)

luke-king 2024. 5. 18. 18:14

 

 

 

 

 

문제 : https://www.acmicpc.net/problem/29614

 

 

 

 

 

 

문제.


 

 

 

 

 

 

 

 

풀이.


 

import java.text.DecimalFormat;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();

        double sum = 0.0;
        int cnt = 0;

        for (int i = 0; i < str.length(); i++) {
            char grade = str.charAt(i);
            double gradeValue = 0.0;

            if (i < str.length() - 1 && str.charAt(i + 1) == '+') {
                switch (grade) {
                    case 'A':
                        gradeValue += 4.5;
                        break;
                    case 'B':
                        gradeValue += 3.5;
                        break;
                    case 'C':
                        gradeValue += 2.5;
                        break;
                    case 'D':
                        gradeValue += 1.5;
                        break;
                }
                i++;
            } else {
                switch (str.charAt(i)) {
                    case 'A':
                        gradeValue += 4.0;
                        break;
                    case 'B':
                        gradeValue += 3.0;
                        break;
                    case 'C':
                        gradeValue += 2.0;
                        break;
                    case 'D':
                        gradeValue += 1.0;
                        break;
                    case 'F':
                        gradeValue += 0.0;
                        break;
                }
            }
            sum += gradeValue;
            cnt++;
        }

        double average = sum / cnt;
        DecimalFormat df = new DecimalFormat("#.####");
        System.out.println(df.format(average));
    }

}

 

오늘 문제는 백준의 스페셜 저지 " 학점계산프로그램 " 문제이다.

제출 비율이 낮은 문제였고 그만큼 구글링을 해도 잘 나오지 않는 문제여서 풀어 봤다.

처음에는 배열, split() 함수를 사용해서 풀어보려 했지만 어렵게 생각하는 거 같아 쉽게 생각해 봐서 switch 문을 사용했다.

(필자의 문제점은 항상 어려운 생각과 문제 풀이를 더 꽈서 생각해서 쉬운 문제도 어렵게 접근한다....)

여튼! 문제에서 까다로웠던 점은 공백 없이 입력하며 A+A를 입력하면 A+, A의 점수를 합하는 알고리즘이 조금 까다로웠다.

그럼 바로 문제풀이를 해보겠다.

 

1. charAt 를 사용해 각 문자 하나씩 잘라 준다.

 

2. 그리고 조건식내에 ' A, B, C, D ' 일 때 다음 문자가 ' + ' 인지 확인하고 다음 문자가 ' + '이면 i++를 통해 건너뛴다.

즉 +이면 A+, B+, C+, D+ 점수에 맞게 합산되고 '+'의 인덱스를 건너뛰는 거다.

 

3. 그렇다면 다음 문자가 ' + ' 가 아니라면 자연스럽게 A, B, C, D 점수에 맞게 합산되는 거다.

 

4. 다음으로 소수점 4 자릿수까지 보장해야 하기에 ' DecimalFormat '를 사용해 준다.

(DecimalFormat은 끝자리가 0일 경우 해당 0 은 생략된다.)