본문 바로가기

백준

[JAVA] 백준 18110번: solved.ac

 


문제

  • 한 문제에 대한 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)));
    }
}

 

 

채점 결과

18110번 채점 결과

기타

  • 조건 분기가 까다로워 코드가 더러운 감이 없지않아 있다.

 

문제 링크

'백준' 카테고리의 다른 글

[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