문법을 익숙하게 해준 고마운 문제이다.
이번 문제는 메모리가 매우 넉넉하고 과목이 20개 고정이란 점에서 시간 복잡도와 메모리 초과는 생각 안해도 된다고 판단했다.
내가 생각한 로직이다.
배열 형식인 split을 사용
tokens[1] -> double형으로 변환
tokens[2] -> 문자열 형식에 맞게 double형으로 변환
tokens[1] * tokens[2]을 sum에 누적
추후 나머지 전공평점을 더해서 나누기
이를 통해 코드를 작성해봤다.
mport java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str;
String[] tokens;
double token1 = 0.0;
double token2 = 0.0;
double sum = 0;
double num = 0;
for (int i = 0; i < 20; i++) {
str = br.readLine();
tokens = str.split(" ");
token1 = Double.parseDouble(tokens[1]);
if (tokens[2] == "P")
continue;
switch(tokens[2]) {
case "A+":
token2 = 4.5;
break;
case "A0":
token2 = 4.0;
break;
case "B+":
token2 = 3.5;
break;
case "B0":
token2 = 3.0;
break;
case "C+":
token2 = 2.5;
break;
case "C0":
token2 = 2.0;
break;
case "D+":
token2 = 1.5;
break;
case "D0":
token2 = 1.0;
break;
case "F":
token2 = 0.0;
break;
}
sum += (token1 * token2);
num += token1;
}
System.out.println(sum/num);
}
}
하지만,, 나에게 들려온 대답은,,
디버그를 해보니,
if (tokens[2] == "P")
continue;
이 부분이 문제였다!
String이나 Integer같은 참조 자료형은 객체의 참조(메모리 주소)를 비교 하기 때문에, 위 처럼 사용한다면 false가 뜨게 된다!
if (tokens[2].equals("P"))
continue;
이렇게 바꾸니 값이 잘 나온다! 또한 마지막 출력의 소수점을 제한 출력으로 코드를 바꿨다.
최종코드
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str;
String[] tokens;
double token1 = 0.0;
double token2 = 0.0;
double sum = 0;
double num = 0;
for (int i = 0; i < 20; i++) {
str = br.readLine();
tokens = str.split(" ");
token1 = Double.parseDouble(tokens[1]);
if (tokens[2].equals("P"))
continue;
switch(tokens[2]) {
case "A+":
token2 = 4.5;
break;
case "A0":
token2 = 4.0;
break;
case "B+":
token2 = 3.5;
break;
case "B0":
token2 = 3.0;
break;
case "C+":
token2 = 2.5;
break;
case "C0":
token2 = 2.0;
break;
case "D+":
token2 = 1.5;
break;
case "D0":
token2 = 1.0;
break;
case "F":
token2 = 0.0;
break;
}
sum += (token1 * token2);
num += token1;
}
System.out.printf("%.6f", (sum/num));
}
}
배운점
기본 자료형과 참조 자료형에 대한 값비교에 대해 확실하게 이해가 가도록 도와준 고마운 문제였다.
또한 점점 디버그에 대해 익숙해지는 것 같다!
'코딩테스트 > 백준' 카테고리의 다른 글
[백준 JAVA] 2566 - 최댓값 (0) | 2024.11.27 |
---|---|
[백준 JAVA] 2738 - 행렬 덧셈 (0) | 2024.11.27 |
[백준 JAVA] 1316 - 그룹 단어 체커 (0) | 2024.11.25 |
[백준 JAVA] 2941 - 크로아티아 알파벳 (0) | 2024.11.25 |
[백준 JAVA] 2444 - 별 찍기 - 7 (0) | 2024.11.25 |