#2754 - 학점 계산
📌 문제 정보
- 문제 이름 : #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 상수 | 어떤 타입이든 키 가능 |