문제
- 한 문제에 대한 N명의 난이도 평가가 주어질 때, 30% 절사평균을 구하는 문제.
아이디어
- Math.round 메서드를 이용해 반올림을 한다.
- 카운팅 정렬을 통해 수를 순서대로 입력받고 정렬한다.
- 입력된 수를 카운트한 배열의 첫 번째 인덱스부터 탐색하며 하위 15%를 제외한 나머지를 합한다.
- 더하는 도중 상위 15%의 시작점에 도달하면 반복을 종료한다.
풀이
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 카운팅 정렬에 사용할 배열
int[] scores = new int[31];
int n = Integer.parseInt(br.readLine());
// 입력되는 수 카운트
for(int i=0; i<n; i++) {
int difficulty = Integer.parseInt(br.readLine());
scores[difficulty]++;
}
// 배제해야 하는 인원 수 계산
int num = Math.round(n * 0.15f);
// 배제 인원수 체크용
int cnt = 0;
// 누적 인원 수 체크용
int cnt2 = 0;
int result = 0;
for(int i=1; i<31; i++) {
// i 의 난이도를 준 사람이 있을 경우
if(scores[i] > 0) {
// i 의 난이도를 준 사람 수 만큼 반복
for(int j=0; j<scores[i]; j++) {
// 하위 15%가 아닐 때
if(cnt >= num) {
// 상위 15%가 맞다면 배제
if(cnt2 >= n-num) {
continue;
}
result += i;
cnt2++;
continue;
}
cnt2++;
cnt++;
}
}
}
System.out.println(Math.round((float) result /(n-num*2)));
}
}
채점 결과
기타
- 조건 분기가 까다로워 코드가 더러운 감이 없지않아 있다.
문제 링크
'백준' 카테고리의 다른 글
[JAVA] 백준 1966번: 프린터 큐 (0) | 2024.07.21 |
---|---|
[JAVA] 백준 1929번: 소수 구하기 (0) | 2024.07.21 |
[JAVA] 백준 10845번: 큐 (0) | 2024.07.20 |
[JAVA] 백준 10828번: 스택 (0) | 2024.07.20 |
[JAVA] 백준 10816번: 숫자 카드 2 (0) | 2024.07.20 |