CODING TEST/baekjoon

#2754 - 학점 계산

iamyuunzo 2025. 7. 9. 12:39

📌 문제 정보

- 문제 이름 : #2754번 - 학점 계산

- 문제 링크: https://www.acmicpc.net/problem/2754

 

 

📌 문제 요약

- 핵심 조건: C언어 성적이 주어졌을 때, 평점은 몇 점인지 출력하는 프로그램을 작성하시오.

- A+: 4.3, A0: 4.0, A-: 3.7   /   B+: 3.3, B0: 3.0, B-: 2.7   /   C+: 2.3, C0: 2.0, C-: 1.7   /   D+: 1.3, D0: 1.0, D-: 0.7   /   F: 0.0

  (성적은 문제에서 설명한 13가지 중 하나이다.)

- 제한: 없음

 

 

📌 내 풀이 및 코드

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String score = sc.next();
        
        if (score.equals("A+")) {
            System.out.print("4.3");
        } else if (score.equals("A0")) {
            System.out.print("4.0");
        } else if (score.equals("A-")) {
            System.out.print("3.7");
        } else if (score.equals("B+")) {
            System.out.print("3.3");
        } else if (score.equals("B0")) {
            System.out.print("3.0");
        } else if (score.equals("B-")) {
            System.out.print("2.7");
        } else if (score.equals("C+")) {
            System.out.print("2.3");
        } else if (score.equals("C0")) {
            System.out.print("2.0");
        } else if (score.equals("C-")) {
            System.out.print("1.7");
        } else if (score.equals("D+")) {
            System.out.print("1.3");
        } else if (score.equals("D0")) {
            System.out.print("1.0");
        } else if (score.equals("D-")) {
            System.out.print("0.7");
        } else {
            System.out.print("0.0");
        }
    }
}

<-- 내가 처음에 어떻게 풀었는지 -->

- 너무 무모한 코드라 말이 안되는 것 같았는데 다른 문법이 생각나지 않아서 저렇게 제출함...

- 근데 생각보다 나처럼 else-if 써서 푼 사람들이 많긴 했는데 최대한 코드를 줄일 수 있는 방법이 있나 찾아봄.

 

 

📌 다른 풀이

// 1. Switch문
 switch (score) {
            case "A+":
                System.out.print("4.3");
                break;
            case "A0":
                System.out.print("4.0");
                break;
            case "A-":
                System.out.print("3.7");
                break;
            case "B+":
                System.out.print("3.3");
                break;
            case "B0":
                System.out.print("3.0");
                break;
            case "B-":
                System.out.print("2.7");
                break;
            case "C+":
                System.out.print("2.3");
                break;
            case "C0":
                System.out.print("2.0");
                break;
            case "C-":
                System.out.print("1.7");
                break;
            case "D+":
                System.out.print("1.3");
                break;
            case "D0":
                System.out.print("1.0");
                break;
            case "D-":
                System.out.print("0.7");
                break;
            default:
                System.out.print("0.0");
                break;
        }

- switch문은 score 문자열과 각 case 값을 비교해서 딱 맞으면 해당 블록 실행.

- break를 case마다 써야 다른 case로 빠져나오지 않고 멈춤.

 

// 2. Map 자료구조 사용

        Map<String, String> gradeMap = new HashMap<>();
        gradeMap.put("A+", "4.3");
        gradeMap.put("A0", "4.0");
        gradeMap.put("A-", "3.7");
        gradeMap.put("B+", "3.3");
        gradeMap.put("B0", "3.0");
        gradeMap.put("B-", "2.7");
        gradeMap.put("C+", "2.3");
        gradeMap.put("C0", "2.0");
        gradeMap.put("C-", "1.7");
        gradeMap.put("D+", "1.3");
        gradeMap.put("D0", "1.0");
        gradeMap.put("D-", "0.7");

        System.out.print(gradeMap.getOrDefault(score, "0.0"));

- 조건이 많을 때 사용하면 깔끔함.

- score -> 평점을 맵핑 테이블로 만들어 두고 입력된 키로 바로 값을 꺼내는 방식.

- 깔끔해서 실전에서 자주 씀. (값 추가와 수정이 훨씬 쉬움.)

 

📌 문법 정리

<-- 이번 문제에서 새로 배운 Java 문법 정리 -->

** equals() **

- 자바에서 문자열, 객체의 “내용” 을 비교할 때 쓰는 메서드 (문자열 비교는 무조건 equals()!!   /   == 은 안됨.)

- "==" : 주소(참조) => 같은 객체인지만 봄    vs     "equals()" : 같은 값(내용)인지 봄

- equlas를 쓰는 이유 : String 같은 참조 타입은 == 로 비교하면 주소만 비교해서 문자열 값이 같아도 새로운 객체면 false뜸

// 기본 문법
문자열.equals(비교할_문자열)

 

 

 

** switch문 ""

- switch : 비교할 변수 (string, int, char 등 가능)

- case : 비교 값 (값이 같으면 해당 블록을 실행함.)  => case 값은 상수여야 함. (변수X)

- break : 블록 실행 후 switch문 빠져나감.  =>  안 쓰면 다음 case로 넘어감.

- default : 모든 case에 안 맞으면 실행 (선택사항)

// 기본 구조
switch (변수) {
    case 값1:
        // 값1일 때 실행할 코드
        break;
    case 값2:
        // 값2일 때 실행할 코드
        break;
    ...
    default:
        // 모든 case에 안 맞을 때 실행
        break;
}

 

** Map (HashMap) **

- Map? : 키 -> 값 쌍으로 저장하는 자료구조

- key로 value를 빠르게 찾을 수 있음. (HashMap이 가장 기본적)

// 기본 구조
import java.util.HashMap;
import java.util.Map;

Map<KeyType, ValueType> mapName = new HashMap<>();    // 선언

mapName.put(키, 값);					       // 값 추가 (put)
mapName.get(키);  							// 값 가져오기 (get) : 키가 없으면 null
mapName.getOrDefault(키, 기본값);    	     // 키가 없을 때 기본값

 

- Switch vs Map

항목  switch  Map
비교 대상 변수 == 값 키 → 값
조건 수 적으면 좋음 (몇 개 ~ 10개) 많으면 유리 (10개 이상)
유지보수 중간 키-값만 추가하면 돼서 쉽다
실행 속도 조건문이 많아지면 느림 키를 통해 빠르게 찾음
데이터 타입 int, char, String 상수 어떤 타입이든 키 가능