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


package baekjoon;
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
//Main m = new Main();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
double totalGrade = 0;
double totalCredit = 0;
double avg;
int cnt = 0;
for(int i = 0; i < 20; i++){
StringTokenizer st = new StringTokenizer(br.readLine());
String Subject = st.nextToken();
double credit = Double.parseDouble(st.nextToken());
String grade = st.nextToken();
//double changeGrade = m.Grade(grade);
double changeGrade = Grade(grade);
if (changeGrade != -1){
totalGrade = totalGrade + (credit * changeGrade);
totalCredit = totalCredit + credit;
}
}
avg = totalGrade / totalCredit;
System.out.println(avg);
}
static public double Grade(String str){
switch (str){
case "A+":
return 4.5;
case "A0":
return 4.0;
case "B+":
return 3.5;
case "B0":
return 3.0;
case "C+":
return 2.5;
case "C0":
return 2.0;
case "D+":
return 1.5;
case "D0":
return 1.0;
case "F":
return 0.0;
}
return -1;
}
}
과목 평점을 점수로 변환하는 과정을 메서드로 만들어서 따로 빼줬는데
이 메서드를 main으로 불러올 때
Main m = new Main() 으로 Main 내 객체를 생성한 뒤 m.Grade()로 불러와야 하는지,
아니면 Grade를 선언할 때 static을 붙여서 객체 생성할 필요 없이 바로 가져와야 하는지 구분이 안 가서 지피티한테 물어봄



명확하게 이해는 안 되지만 그렇다고 합니다.
그래서 지피티가 피드백 해준 코드는 무엇인가.
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
double totalScore = 0.0; // 학점 * 과목평점 합
double totalCredit = 0.0;
for (int i = 0; i < 20; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
st.nextToken(); // subject (사용 안 함)
double credit = Double.parseDouble(st.nextToken());
String grade = st.nextToken();
double point = gradeToPoint(grade);
if (point >= 0) { // P 제외
totalScore += credit * point;
totalCredit += credit;
}
}
System.out.println(totalScore / totalCredit);
}
static double gradeToPoint(String grade) {
switch (grade) {
case "A+": return 4.5;
case "A0": return 4.0;
case "B+": return 3.5;
case "B0": return 3.0;
case "C+": return 2.5;
case "C0": return 2.0;
case "D+": return 1.5;
case "D0": return 1.0;
case "F": return 0.0;
default: return -1; // P 또는 기타
}
}
}
1. 변수/메소드 네이밍
- 메소드명은 보통 동사/소문자 시작: Grade -> gradeToPoint / toPoint
- 변수명도 소문자 시작: Subject -> subject(현재는 사용도 안 함;)
2. cnt 변수 안 쓰니까 제거
3. -1 매직넘버 대신 'P인지 직접 체크'
4. switch에서 default를 명시하면 더 안전
5. 출력 포맷
소수점 자리 지정하는 경우 유의
System.out.printf("%.6f%n", avg);'Java' 카테고리의 다른 글
| [백준] 코딩테스트 문제 2566: 최댓값 (0) | 2026.03.04 |
|---|---|
| [백준] 코딩테스트 문제 2738: 행렬 덧셈 (0) | 2026.03.04 |
| [백준] 코딩테스트 문제 1316: 그룹 단어 체커 (0) | 2026.03.02 |
| [백준] 코딩테스트 문제 1157: 단어 공부 (0) | 2026.02.25 |
| [백준] 코딩 테스트 문제 10988: 팰린드롬인지 확인하기 (0) | 2026.02.24 |