# 문제
주소: 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();
}
}
# 입/출력 결과
# 풀이
- while문을 사용해서 조건식에 true를 작성하여 무한 반복
- while문 안에 String input으로 입력값 받기
- while문 안에 input에 입력값이 있는지 확인하는 조건문을 작성하여 입력값이 null이거나 비어있으면 종료되도록 작성
- input값을 공백 기준으로 .split(" ") 해서 배열로 저장 -> String[] inputArr
- inputArr에는 공백 기준으로 과목, 학점, 등급으로 저장되어 있는데 이 값들을 각각 변수에 저장 -> String subject, double credit, String grade / 과목, 학점, 등급
- 등급 별 점수를 저장할 변수도 선언 및 초기화 -> double grPoint
- if문을 사용해서 과목(subject) 길이가 1이상, 50이하 인지 확인.
- 과목 길이가 적합하면 그 다음은 if문을 사용해서 등급에 P 등급이 있는지 확인하여 P등급이 있으면 continue; 처리한다.
- P등급이 없으면, 등급 점수를 구하는데 switch문을 사용해서 등급(grade)의 case를 찾아서 등급점수(grPoint)에 해당 등급의 점수를 저장한다.
- 등급점수를 구했기 때문에 과목 길이부터 체크하던 if문 아래에 입력 받은 학점끼리 더해준다. -> creditSum = creditSum + credit;
- 그 다음 학점 * 과목평점을 ArrayList<Double> resultArr에 추가해준다.
- while문 바깥에서 resultArr에 담은 학점 * 과목평점의 합을 for-in문을 사용하여 result에 저장한다.
- (학점 * 과목평점)의 합인 result에 총 학점인 creditSum을 나눈 값을 6자리까지만 출력한다. -> .printf("%.6f", result/creditSum);
- 마지막에 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 지정해주고 내가 계산하려는 값?을 두번째 인자에 작성했다.
'코딩 테스트' 카테고리의 다른 글
[코딩테스트] 백준 2566번: 최댓값 (0) | 2025.06.23 |
---|---|
[코딩테스트] 백준 2738번: 행렬 덧셈 (0) | 2025.06.22 |
[코딩테스트] 백준 1316번: 그룹 단어 체커 (0) | 2025.06.20 |
[코딩테스트] 백준 2941번: 크로아티아 알파벳 (0) | 2025.06.18 |
[코딩테스트] 백준 1157번: 단어 공부 (0) | 2025.06.18 |