swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PwGK6AcIDFAUq
문제 풀이 (HashMap)
나는 이 문제를 HashMap으로 접근하였다.
입력받은 점수를 중간고사, 기말고사, 과제 비율만큼 계산하여 해당 index와 계산된 비율을 hashMap에 저장한다.
그리고 HashMap을 Value 순으로 내림차순 정렬한다. (List를 사용한다)
그리고 key와 grade값을 저장할 또다른 HashMap을 만들어주고 ratio (N/10) 만큼씩 잘라서 점수를 주면 된다.
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
for (int t = 1; t <= T; t++) {
HashMap<Integer, Double> map = new HashMap<>();
int N = sc.nextInt();
int K = sc.nextInt();
int ratio = N / 10;
for (int i = 1; i <= N; i++) {
double a = sc.nextDouble();
double b = sc.nextDouble();
double c = sc.nextDouble();
double score = a * 0.35 + b * 0.45 + c * 0.2;
map.put(i, score);
}
List<Integer> keySetList = new ArrayList<>(map.keySet());
Collections.sort(keySetList, (o1, o2) -> (map.get(o2).compareTo(map.get(o1))));
HashMap<Integer, String> gradeMap = new HashMap<>();
String[] grade = { "A+", "A0", "A-", "B+", "B0", "B-", "C+", "C0", "C-", "D0" };
int i = 0;
for (Integer key : keySetList) {
gradeMap.put(key, grade[i++ / ratio]);
}
System.out.println("#" + t + " " + gradeMap.get(K));
}
}
}
다른 풀이 방법
(1) Array
import java.util.Scanner;
import java.util.Arrays;
import java.util.Collections;
public class Solution {
public static void main(String args[]) {
final String grades[] = {"A+","A0","A-","B+","B0","B-","C+","C0","C-","D0"};
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
for(int t=1; t<=T; t++) {
int n = sc.nextInt();
int k = sc.nextInt()-1;
Integer a[] = new Integer[n];
for(int i=0; i<n; i++) {
int mid = sc.nextInt();
int fin = sc.nextInt();
int hom = sc.nextInt();
a[i] = mid*35 + fin*45 + hom*20;
}
int k_score = a[k];
Arrays.sort(a, Collections.reverseOrder());
int k_rank = Arrays.asList(a).indexOf(k_score);
System.out.format("#%d %s\n", t, grades[10*k_rank/n]);
}
}
}
이 문제로 배운 점
파이썬처럼 dict이 없기 때문에 HashMap을 잘 다루는데 연습이 필요해 보인다.
정렬의 경우도 잘 알아두기!
'Algorithm(알고리즘) > SWEA(SW Expert Academy)' 카테고리의 다른 글
[SWEA][Java][D4][최소 신장 트리,크루스칼] 1251 - 하나로 (0) | 2021.03.29 |
---|---|
[SWEA][Java][D3][시물레이션] 1873 - 상호의 배틀필드 (0) | 2021.02.03 |
[SWEA][Java][D2] 1204 - [S/W 문제해결 기본] 1일차 - 최빈수 구하기 (0) | 2021.01.26 |
[SWEA][Java][D2] 1954 - 달팽이 숫자 (0) | 2021.01.24 |
[SWEA][Java][D2] 2001 - 파리 퇴치 (0) | 2021.01.17 |