
import java.io.*;
import java.util.StringTokenizer;
public class Main {
public static void solution() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str[] = new String[20];
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};
double totalSum = 0;
double scoreSum = 0;
for (int i = 0; i < 20; i++) {
str[i] = br.readLine(); // 한 줄 입력 받고
StringTokenizer st = new StringTokenizer(str[i], " ");
String subject = st.nextToken(); // 과목명
double score = Double.parseDouble(st.nextToken()); // 학점
String grade = st.nextToken(); // 점수
for (int j = 0; j < 10; j++) {
if (grade.equals(gradeList[j])) {
totalSum += score * gradeScore[j];
if (j != 9) { // Pass 과목 총 학점에서 제외
scoreSum += score;
}
}
}
}
double average = totalSum/scoreSum;
System.out.printf("%.6f\n", average);
br.close();
}
public static void main(String[] args) throws IOException {
solution();
}
}
학점과 성적을 담을 리스트를 만들고 20줄의 입력을 받기위한 반복문을 작성했다.
StringTokenizer 을 이용해 공백을 기준으로 구분 후 과목명, 학점, 점수를 분리해 계산했다.
학점과 성적을 매핑하는데 리스트를 사용해서 코드가 복잡해보였다.
또한 반복문이 두 번 들어가서 불필요하게 보였다.
import java.io.*;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;
public class Main {
private static final int SUBJECT_COUNT = 20;
public static void solution() throws IOException {
Map<String, Double> gradeMap = new HashMap<>();
gradeMap.put("A+", 4.5);
gradeMap.put("A0", 4.0);
gradeMap.put("B+", 3.5);
gradeMap.put("B0", 3.0);
gradeMap.put("C+", 2.5);
gradeMap.put("C0", 2.0);
gradeMap.put("D+", 1.5);
gradeMap.put("D0", 1.0);
gradeMap.put("F", 0.0);
gradeMap.put("P", 0.0);
double totalSum = 0.0; // 총 점수 (학점 * 성적)
double scoreSum = 0.0; // 총 학점
try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
for (int i = 0; i < SUBJECT_COUNT; i++) {
String line = br.readLine();
StringTokenizer st = new StringTokenizer(line, " ");
String subject = st.nextToken(); // 과목명
double score = Double.parseDouble(st.nextToken()); // 학점
String grade = st.nextToken(); // 성적
double gradeValue = gradeMap.get(grade);
totalSum += score * gradeValue;
if (!grade.equals("P")) {
scoreSum += score;
}
}
}
double average = totalSum / scoreSum;
System.out.printf("%.6f\n", average);
}
public static void main(String[] args) throws IOException {
solution();
}
}
HashMap을 사용해 성적과 점수를 매핑하여 가독성과 효율성을 높였다.
BufferdReader 사용시 명시적으로 close() 사용하는 대신 try-with-resources를 사용해 자원 관리를 간소화했다.
(이 부분은 나중에 따로 다뤄 보도록 하겠다.)
또한 상수를 사용해 가독성과 유지보수성을 향상했다.