코딩 테스트

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

dev.jelee 2025. 6. 21. 23:08

# 문제

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

 

# 코드

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

public class BOJ25206_v1 {
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    ArrayList<Double> resultArr = new ArrayList<>();
    
    double creditSum = 0; // 학점 총 합
    double result = 0;

    while (true) {
      String input = br.readLine();
      if (input == null || input.trim().isEmpty()) { // input값 없으면 종료
        break;
      }

      String[] inputArr = input.split(" "); // 공백기준으로 나누어 저장
      String subject = inputArr[0]; // 과목
      double credit = Double.parseDouble(inputArr[1]); // 학점
      String grade = inputArr[2]; // 등급
      double grPoint = 0; // 등급 점수

      if (1 <= subject.length() && subject.length() <= 50) { // 과목 길이 제한
        if (grade.contains("P")) { // P 등급은 계산 x
          continue;
        } else {
          // 등급 점수 구하기
          switch (grade) {
            case "A+" :
              grPoint = 4.5;
              break;
            case "A0" :
              grPoint = 4.0;
              break;
            case "B+" :
              grPoint = 3.5;
              break;
            case "B0" :
              grPoint = 3.0;
              break;
            case "C+" :
              grPoint = 2.5;
              break;
            case "C0" :
              grPoint = 2.0;
              break;
            case "D+" :
              grPoint = 1.5;
              break;
            case "D0" :
              grPoint = 1.0;
              break;
            case "F" :
              grPoint = 0;
              break;
            default :
              System.out.println("올바른 등급을 입력해주세요.");
          }
        }
      }

      // 학점끼리 더하기
      creditSum = creditSum + credit;

      // 학점 * 등급 점수 리스트에 추가
      resultArr.add(credit * grPoint);
    }

    // 합 나누기 count
    for (Double arr : resultArr) {
      result = result + arr;
    }

    System.out.printf("%.6f", result/creditSum); 
    br.close();
  }
}

 

# 입/출력 결과

 

# 풀이

  1. while문을 사용해서 조건식에 true를 작성하여 무한 반복
  2. while문 안에 String input으로 입력값 받기
  3. while문 안에 input에 입력값이 있는지 확인하는 조건문을 작성하여 입력값이 null이거나 비어있으면 종료되도록 작성
  4. input값을 공백 기준으로 .split(" ") 해서 배열로 저장 -> String[] inputArr
  5. inputArr에는 공백 기준으로 과목, 학점, 등급으로 저장되어 있는데 이 값들을 각각 변수에 저장 -> String subject, double credit, String grade / 과목, 학점, 등급
  6. 등급 별 점수를 저장할 변수도 선언 및 초기화 -> double grPoint
  7. if문을 사용해서 과목(subject) 길이가 1이상, 50이하 인지 확인.
  8. 과목 길이가 적합하면 그 다음은 if문을 사용해서 등급에 P 등급이 있는지 확인하여 P등급이 있으면 continue; 처리한다.
  9. P등급이 없으면, 등급 점수를 구하는데 switch문을 사용해서 등급(grade)의 case를 찾아서 등급점수(grPoint)에 해당 등급의 점수를 저장한다.
  10. 등급점수를 구했기 때문에 과목 길이부터 체크하던 if문 아래에 입력 받은 학점끼리 더해준다. -> creditSum = creditSum + credit;
  11. 그 다음 학점 * 과목평점을 ArrayList<Double> resultArr에 추가해준다.
  12. while문 바깥에서 resultArr에 담은 학점 * 과목평점의 합을 for-in문을 사용하여 result에 저장한다.
  13. (학점 * 과목평점)의 합인 result에 총 학점인 creditSum을 나눈 값을 6자리까지만 출력한다. -> .printf("%.6f", result/creditSum);
  14. 마지막에 BufferedReader를 .close(); 한다.

 

# 메모

  • 입력한 값이 null인지 조건문으로 체크하려고 했는데, 빨간 밑줄이 떠서 왜 그러나 찾아보니 String[] input 이렇게 나는 배열로 저장해서 그랬다. 하나? 한 줄로 된 문자열을 체크해야하는 거라서 String input으로 먼저 입력 값을 받은 다음에 if문을 사용해 null이거나 .isEmpty()인지 체크한 다음에 null이거나 빈 문자열이면 종료되도록 break;를 작성했다. 그 다음에 String[] inputArr 문자열 배열을 생성해서 iputArr에 input.split(" "); 이렇게 공백 기준으로 나누어 배열로 저장했다.
  • Double로 형변환 하는 방법을 알게 되었다. -> Double.parseDouble();
  • 학점 * 괌고평점을 구해놓고선 마지막에 나눌 때 학점의 총합으로 나누어야 하는데, 평균을 구한다고 생각하여 과목 개수로 나누어서 나는 제대로 식을 작성한 거 같은데 왜 안 나오지? 하면서 해맸다. (긁적...) 문제를 잘 읽어야겠다.
  • 소수점 몇 번째까지만 출력하는 것을 몰라서 찾아보았다. .printf("format", 변수) 이렇게 작성하면 됐다. 그래서 .printf("%.6", result/creditSum); 이렇게 6자리만 출력할 거라서 %.6으로 format 지정해주고 내가 계산하려는 값?을 두번째 인자에 작성했다.