https://www.acmicpc.net/problem/25206
문제
> 인하대학교 컴퓨터공학과를 졸업하기 위해서는, 전공평점이 3.3 이상이거나 졸업고사를 통과해야 한다.
> 그런데 아뿔싸, 치훈이는 깜빡하고 졸업고사를 응시하지 않았다는 사실을 깨달았다!
> 치훈이의 전공평점을 계산해주는 프로그램을 작성해보자.
> 전공평점은 전공과목별 (학점 × 과목평점)의 합을 학점의 총합으로 나눈 값이다.
> 인하대학교 컴퓨터공학과의 등급에 따른 과목평점은 다음 표와 같다.
A+ 4.5
A0 4.0
B+ 3.5
B0 3.0
C+ 2.5
C0 2.0
D+ 1.5
D0 1.0
F 0.0
> P/F 과목의 경우 등급이 P또는 F로 표시되는데, 등급이 P인 과목은 계산에서 제외해야 한다.
> 과연 치훈이는 무사히 졸업할 수 있을까?
접근
맵으로 학점 변환표를 미리 만들어둔다. 그럼 입력으로 등급이 들어오면 등급을 key값으로 가지는 value값이 실수형으로 반환된다.
총 20가지의 과목이므로 20번 StringTokenizer로 입력받고 과목명은 필요없으므로 st.nextToken()으로 한번 털어준다.
학점 입력받고 누적, 등급변환해서 학점과 곱해서 누적,
뒤의 값을 앞의 값으로 나눠 출력해준다.
문제해결
> Map grade로 문자열 key값, double형 value값을 가지도록 학점 변환표를 만든다.
> 20가지 과목을 입력받으며 과목명에 해당하는 token은 버리고 두번째 토큰을 num으로 학점에 저장한다.
> 세번째 토큰인 등급을 가져와 P과목인지 본다.
> F는 상관없지만 P라면 계산에서 빼기위해 continue로 넘어간다.
> 아닌 경우엔 총 학점의 수를 누적하고, 등급을 변환하여 점수와 학점을 곱한 값을 누적한다.
> sumgd값을 sum값으로 나누어 학점을 구해준다.
코드
import java.io.*;
import java.util.*;
import java.lang.*;
public class Main
{
//25206번 너의 평점은
static final Map<String, Double> grade = new HashMap<>();
static
{
grade.put("A+", 4.5);
grade.put("A0", 4.0);
grade.put("B+", 3.5);
grade.put("B0", 3.0);
grade.put("C+", 2.5);
grade.put("C0", 2.0);
grade.put("D+", 1.5);
grade.put("D0", 1.0);
grade.put("F", 0.0);
}
public static void main(String[] args) throws IOException
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
double sum = 0, sumgd = 0;
for(int i = 0; i < 20; i++)
{
StringTokenizer st = new StringTokenizer(br.readLine());
st.nextToken();
double num = Double.parseDouble(st.nextToken());
String str = st.nextToken();
if(str.equals("P")) continue;
double gd = grade.get(str);
sum += num;
sumgd += num * gd;
}
System.out.printf("%.6f", sumgd/sum);
}
}

후기
학점 변환을 스마트 하게하는 방법이 없을까 하다가 map으로 변환표를 만들어봤다. c++처럼 .second같이 쓰지않고 put과 get을 사용한다.
그리고 과목명을 안쓰고 싶어서 어떻게 할 까 하다가 그냥
st.nextToken을 쌩으로 사용하여 한번 버려버리면 된다는걸 알게 되었다.