코딩테스트/백준

[백준 JAVA] 25206 - 너의 평점은

kittae 2024. 11. 26. 14:14

 

문법을 익숙하게 해준 고마운 문제이다.

 

이번 문제는 메모리가 매우 넉넉하고 과목이 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));
    }
}

 

배운점

기본 자료형과 참조 자료형에 대한 값비교에 대해 확실하게 이해가 가도록 도와준 고마운 문제였다.

또한 점점 디버그에 대해 익숙해지는 것 같다!