문제
단계별로 풀어보기 - 심화 1 문제
문제를 이해하는 데 어렵지는 않았다. 그냥 학점과 과목평점을 곱하고 학점 총합으로 나눠주면 되는 간단한 문제였다.
풀이
오래 걸리지 않고 풀었는데 다른 사람들의 풀이를 보니 내가 많이 부족하다는 것을 느꼈다.
먼저 내가 작성한 풀이부터 보자면 아래 코드와 같다.
package Sliver.Silver5;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Silver5_25206_심화1 {
public static void main(String[] args) throws IOException {
// (학점 * 과목평점) / 학점 총합
// p는 계산에서 제외
// 입력
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
double totalScore = 0;
double total = 0;
for (int i = 0; i < 20; i++) {
st = new StringTokenizer(br.readLine());
st.nextToken();
double score = Double.parseDouble(st.nextToken());
String gradeScore = st.nextToken();
if (gradeScore.equals("A+")) {
total += score * 4.5;
totalScore += score;
} else if (gradeScore.equals("A0")) {
total += score * 4.0;
totalScore += score;
} else if (gradeScore.equals("B+")) {
total += score * 3.5;
totalScore += score;
} else if (gradeScore.equals("B0")) {
total += score * 3.0;
totalScore += score;
} else if (gradeScore.equals("C+")) {
total += score * 2.5;
totalScore += score;
} else if (gradeScore.equals("C0")) {
total += score * 2.0;
totalScore += score;
} else if (gradeScore.equals("D+")) {
total += score * 1.5;
totalScore += score;
} else if (gradeScore.equals("D0")) {
total += score * 1.0;
totalScore += score;
} else if (gradeScore.equals("F")) {
total += score * 0.0;
totalScore += score;
}
}
// 출력
System.out.printf("%.6f", (total / totalScore));
}
}
코드를 보면 먼저 입력 값을 한 줄 읽어서 토큰으로 나누고 등급을 비교하여 점수를 계산하였다.
코드를 보면 알겠지만 반복되는 코드가 많고 변수 이름도 명확하지 못해서 좋지 않은 코드라고 생각한다.
문제를 풀면서 중간에 막혔던 부분이 2가지 있었다.
1. 문자열 비교가 왜 안 되지??
처음에 코드를 작성했을 때 gradeScore == "A+" 이렇게 문자열을 비교했다. 결과값으로 계속 false가 나오길래 왜 나올까를 고민해보니 내가 안일하게 생각했던 부분이였다...
String은 하나의 객체로 참조 변수를 사용하는데 여기서 동등 연산자(==)를 사용하면 실제 값이 아닌 객체의 주소를 비교한다는 것을 까먹고 있었다.
정말 기초적인 부분이였기 때문에 쉬운 문제라고 아무 생각없이 풀었던 나를 반성했다
2. 소수점 출력을 하는 방법
소수점을 6짜리까지 출력을 해야되는데 갑자기 어떻게 했었는지 생각이 나지 않았다.....
이 부분에서도 나의 기초 지식이 너무 부족하다는 것을 다시금 깨닫고 지금 하고 있는 자바 언어 공부를 더 열심히 해야겠다고 생각했다.
개선한 코드
// HashMap으로 처리
Map<String, Double> hashMap = new HashMap<>();
hashMap.put("A+", 4.5);
hashMap.put("A0", 4.0);
hashMap.put("B+", 3.5);
hashMap.put("B0", 3.0);
hashMap.put("C+", 2.5);
hashMap.put("C0", 2.0);
hashMap.put("D+", 1.5);
hashMap.put("D0", 1.0);
hashMap.put("F", 0.0);
// 입력
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
double totalScore = 0.0;
double total = 0;
for (int i = 0; i < 20; i++) {
st = new StringTokenizer(br.readLine());
st.nextToken();
double score = Double.parseDouble(st.nextToken());
String grade = st.nextToken();
if (grade.equals("P")) continue;
double getScore = hashMap.get(grade);
totalScore += score * getScore;
total += score;
}
// 출력
System.out.printf("%.6f", (totalScore / total));
개선한 코드를 살펴보면 HashMap으로 각 등급에 맞는 과목 평점을 저장하고, 입력값으로 받은 등급을 key로 하여 값을 찾아내는 코드이다.
입력받는 코드 부분과 출력 부분은 내가 작성한 코드와 똑같지만 연산을 수행하는 부분에서는 HashMap을 사용하여 간결한 코드를 만든것이 나와 다른 부분이다.
내가 작성한 코드는 else-if문을 계속 돌면서 등급에 맞는 조건식을 하나씩 다 따져보며 코드를 수행해야 되지만 HashMap을 이용하여 주어진 key 값에 value만 반환하기 때문에 속도면에서 확실히 차이가 났다.
아직 Map 자료구조에 대해서 공부를 하지 못했지만 얼른 공부를 시작하여 좀 더 직관적이고 깔끔한 코드를 작성해보고 싶다.
'알고리즘 공부' 카테고리의 다른 글
프로그래머스 - 기능개발(Java) (1) | 2023.11.29 |
---|---|
프로그래머스 - 같은 숫자는 싫어(Java) (0) | 2023.11.29 |
백준 실버3 2346번(자바) (0) | 2023.09.07 |
백준 실버2 18870(자바) (0) | 2023.09.07 |
백준 실버5 11866번(자바) (0) | 2023.09.04 |