본문 바로가기
백준 문제 풀이/심화 1

(#25206 Java) 너의 평점은

by _비니_ 2024. 2. 23.

 

 

문제 해결

 

 

전공평점을 계산하는 문제이며, 전공 평점은 전공과목별 (학점 × 과목평점)의 합을 학점의 총합으로 나눈 값이라고 했으니,

각각에 대한 변수를 만들어준다.

 

double totalSum = 0; // 전공 평점의 총 합계
double scoreSum = 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};

 

 

20줄에 걸쳐 치훈이가 수강한 전공과목의 과목명, 학점, 등급이 공백으로 구분되어 주어진다고 하였으니

이를 입력받을 스캐너 객체를 생성해주자.

 

생성해준 후, 입력받은 것들을 각각의 과목명, 학점, 등급으로 분류해주는 작업을 해야하는데, 이를 위해 기초적인 지식을 한 번 더 언급하고 넘어가려 한다.

 

nextLine()
- 현재 위치에서 다음 줄까지의 문자열을 읽어옴
- 개행 문자(\n)가 나타날 때까지의 모든 문자열을 읽어오므로, 한 줄 전체를 가져올 수 있음.

next()
- 공백(스페이스, 탭, 개행 등) 이전까지의 문자열을 읽어옴
- 공백 이전까지의 단어를 토큰으로 취급하여 반환

nextDouble()
- 다음으로 나타나는 double 값(부동소수점)을 읽어옴.
- 공백을 포함하지 않고 다음 double 값까지를 추출하여 반환함

 

 

위를 참고하여 입력받은 여러 줄의 문자열들을 각각으로 분류하는 코드를 작성해보자.

String str[] = new String[20];

for (int i = 0; i < 20; i++) {
    str[i] = in.nextLine();
    Scanner lineScanner = new Scanner(str[i]); 
    
    String subject = lineScanner.next(); //과목명 추출
    double score = lineScanner.nextDouble(); //점수 추출
    String grade = lineScanner.next(); //학점 추출
}

 

과목명, 학점, 등급을 각각 구분해 변수에 저장해놓았다.

 

이제 위에서 등급에 따른 과목 평점들을 저장해놓은 배열들 ( gradeList[ ], gradeScore[ ] )을 이용해 만약 문자열에서 추출된 grade가 gradeList의 [j]번째의 학점과 같다면, 추출된 점수와 gradeScore에 저장된 인덱스 j번의 점수를 곱해 totalSum에 저장해야한다.

 

단, 'P' 학점은 제외하고 계산해야하기 때문에, 만약 j가 인덱스 9에 해당하지 않는 경우에만 계산해준다.

 

for(int j = 0; j < 10; j++) { //배열 인덱스가 (0~9)
    if(grade.equals(gradeList[j])){
        totalSum += score * gradeScore[j];

        //'P' 학점은 제외
        if(j != 9) {
            scoreSum += score;
        }
    }
}

 

 

계산된 최종 totalSum과 scoreSum을 이용해 전공 평점을 계산해 출력해주면 된다 ( 정답과의 절대오차 또는 상대오차가 10−4 이하가 되도록.)

// 전공평점 계산
double majorAverage = totalSum / scoreSum;

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

 

 

 

최종 코드

 

import java.util.Scanner;

public class YourAverage {

    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);

        String str[] = new String[20];

        // 전공평점의 총 합계
        double totalSum = 0;

        // 학점의 총 합계
        double scoreSum = 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++) {
            str[i] = in.nextLine();
            Scanner lineScanner = new Scanner(str[i]); 

            String subject = lineScanner.next(); //과목명 추출
            double score = lineScanner.nextDouble(); //점수 추출
            String grade = lineScanner.next(); //학점 추출

            for(int j = 0; j < 10; j++) { //배열 인덱스가 (0~9)
                if(grade.equals(gradeList[j])){
                    totalSum += score * gradeScore[j];

                    //'P' 학점은 제외
                    if(j != 9) {
                        scoreSum += score;
                    }
                }
            }

            lineScanner.close();
        }

        // 전공평점 계산
        double majorAverage = totalSum / scoreSum;

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

        in.close();
    }
}

 

반응형

'백준 문제 풀이 > 심화 1' 카테고리의 다른 글

(#1316 Java) 그룹 단어 체커  (0) 2024.02.21
(#2941 Java) 크로아티아 알파벳  (0) 2024.02.21