[문제]
https://swexpertacademy.com/main/code/problem/problemSolver.do
[풀이방법]
중간(35%) / 기말(45%) / 과제 (20%) 비율을 계산해서 계산 결과를 Double 형 변수에 저장합니다.
학점을 알고 싶은 학생의 번호를 찾아가는 것이기 때문에 본래 받은 순서(출석 번호라고 간주)를 유지할 필요가 있습니다.
하지만 소팅을 해야 학점을 매길 수 있기 때문에 여기서 hashmap을 사용했습니다.
HashMap<Integer, Double> 을 사용해서 학생의 번호와 계산한 결과값을 넣은 후 스태틱 메소드를 사용해서 소트해줍니다.
소트한 결과를 살펴보면서 HashMap의 키 값과 우리가 찾는 학생의 번호가 일치하면 소트한 순서를 살펴보면서 학점을 구합니다.
학점 비율로 계산한 결과
74.6 | 92.55 | 88.8 | 99.45 | 72.35 | 85.85 | 96.25 | 68.95 | 85.75 | 85.5 |
A- | A+ | A0 |
HashMap을 사용해서 내림차순 한 결과
(출석번호..?를 유지합니다)
4 | 7 | 2 | 3 | 6 | 10 | 9 | 1 | 5 | 8 |
99.45 | 96.25 | 92.55 | 88.8 | 85.85 | 85.75 | 85.5 | 74.6 | 72.35 | 68.95 |
A+ | A0 | A- |
빨간색으로 처리된 번호는 우리가 찾는 번호입니다.
학점은 N 명의 학생이 있을 경우 N/10 명의 학생들에게 동일한 평점을 부여할 수 있기 때문에 N/10을 unit으로 두고 내림차순으로 정렬된 순서 / unit으로 계산하면 알맞는 학점을 구할 수 있습니다.
복잡해보일 수 있지만 HashMap을 사용할 수 있다면 어렵지 않게 해결 할 수 있습니다.
String[] grade = { "A+", "A0", "A-", "B+", "B0", "B-", "C+", "C0", "C-", "D0"};
for (int k = 0; k < T; k++) {
sf.append("#" + (k+1) + " ");
st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken()); //학생 수
int K = Integer.parseInt(st.nextToken()); // 학점을 알고 싶은 학생의 번호
int unit = N /10;
HashMap<Integer, Double> hash = new HashMap<>();
for (int i = 1; i <= N; i++) {
st = new StringTokenizer(br.readLine());
int mid = Integer.parseInt(st.nextToken());
int fi_ex = Integer.parseInt(st.nextToken());
int hw = Integer.parseInt(st.nextToken());
Double result = 0.0;
result += mid * 0.35;
result += fi_ex * 0.45;
result += hw * 0.20;
hash.put(i, result);
}
Iterator it = sortHash(hash).iterator();
int j = 0;
while(it.hasNext()) {
int temp = (int) it.next();
if (K == temp) {
sf.append(grade[j / unit ] + "\n");
break;
}
j++;
}
}
System.out.println(sf.toString());
}
static List<Integer> sortHash(final HashMap<Integer, Double> map) {
List<Integer> list = new ArrayList<>();
list.addAll(map.keySet());
Collections.sort(list, new Comparator<Object>() {
@Override
public int compare(Object o1, Object o2) {
// TODO Auto-generated method stub
Object v1 = map.get(o1);
Object v2 = map.get(o2);
return ((Comparable<Object>) v1).compareTo(v2);
}
});
Collections.reverse(list);
return list;
}
'SWEA > D2' 카테고리의 다른 글
[SWEA 1976][D2][JAVA] 시각덧셈 (0) | 2019.05.02 |
---|---|
[SWEA 1984][D2][JAVA] 중간 평균값 매기기 (0) | 2019.05.01 |
[SWEA 1859][D2][JAVA] 백만장자 프로젝트 (0) | 2019.04.30 |
[SWEA 1986][D2][JAVA] 지그재그 숫자 (0) | 2019.04.30 |
[SWEA 1989][D2][JAVA] 초심자의 회문검사 (0) | 2019.04.30 |