
간단하게 풀겠다~ 했는데
P를 계산에 포함하지 않게 하는걸 오래 고민했다.
그냥 단순하게 빼고 계산하면 되는거인데..!
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
double sum = 0;
double creditsum = 0;
for (int i = 0; i < 20; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
String sbj = st.nextToken();
double credit = Double.parseDouble(st.nextToken());
String grade = st.nextToken();
if (!grade.equals("P")) { // "P"는 GPA 계산에 포함되지 않으므로
creditsum += credit;
switch (grade) {
case "A+":
sum += 4.5 * credit;
break;
case "A0":
sum += 4.0 * credit;
break;
case "B+":
sum += 3.5 * credit;
break;
case "B0":
sum += 3.0 * credit;
break;
case "C+":
sum += 2.5 * credit;
break;
case "C0":
sum += 2.0 * credit;
break;
case "D+":
sum += 1.5 * credit;
break;
case "D0":
sum += 1.0 * credit;
break;
case "F":
sum += 0;
break;
default:
throw new IllegalArgumentException("Invalid grade: " + grade);
}
}
}
if (creditsum > 0) {
sum = sum / creditsum;
} else {
sum = 0;
}
System.out.printf("%.6f%n", sum);
}
}
switch문을 사용했는데 비교 대상이 문자이기도 하고 오류 나기 좋아서
예외처리도 추가해주었다.
다른 방식도 찾아보았다.
스위치문으로 각 grade별 학점을 부여해 주는게 귀찮다면
아래와 같이 리스트를 사용하는 방법도 있다!
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
double sum = 0;
double creditsum = 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++) {
String str = br.readLine();
StringTokenizer st = new StringTokenizer(str);
String sbj = st.nextToken();
double credit = Double.parseDouble(st.nextToken());
String grade = st.nextToken();
for (int j = 0; j < gradeList.length; j++) {
if (grade.equals(gradeList[j])) {
if (j != gradeList.length - 1) {
sum += gradeScore[j] * credit;
creditsum += credit;
}
break;
}
}
}
if (creditsum > 0) {
double gpa = sum / creditsum;
System.out.printf("%.6f%n", gpa);
} else {
System.out.println("0.000000");
}
}
}
이 코드는 배열을 사용해서
반복적으로 if-else 문을 사용하지 않고,
배열 인덱스를 사용하여 직접 접근하여
상수 시간(즉, O(1))에 접근할 수 있기 때문에 더 빠르다.
for (int j = 0; j < gradeList.length; j++) {
if (grade.equals(gradeList[j])) {
// 배열 인덱스를 사용하여 직접 접근
break;
}
}
배열은 순차 검색을 사용하여 인덱스를 빠르게 찾을 수 있기 때문에,
switch문이나 복잡한 if-else 문보다 직관적이고 효율적!
'Coding Test > Baekjoon' 카테고리의 다른 글
| [JAVA] 2566번 최댓값 (0) | 2024.07.22 |
|---|---|
| [JAVA] 1316번 그룹 단어 체커 (0) | 2024.07.16 |