Uknow's Lab.
article thumbnail

https://www.acmicpc.net/problem/18110

 

18110번: solved.ac

5명의 15%는 0.75명으로, 이를 반올림하면 1명이다. 따라서 solved.ac는 가장 높은 난이도 의견과 가장 낮은 난이도 의견을 하나씩 제외하고, {5, 5, 7}에 대한 평균으로 문제 난이도를 결정한다.

www.acmicpc.net

 

난이도 : 실버 4
태그 : 수학, 구현, 정렬

 

 

설명

Solved.ac 의 문제 난이도 계산 방법을 바탕으로 만든 문제인 것 같네요.

솔브드의 난이도 계산 시스템은 극단적인 값으로 인해 평균이 왜곡되는 것을 막기 위해 절사 평균을 사용하는데요.

단순히 의견 개수 * 0.15 (반올림)개 만큼 양극값을 제거하고 평균을 계산하면 됩니다.

 

 

 

소스코드

fun main() = with(System.`in`.bufferedReader()) {
    val n = readLine().toInt()
    val arr = Array(n) { readLine().toInt() }.sorted()

    val cutLine = Math.round(n * 0.15).toInt()

    var sum = 0
    for (i in cutLine until n - cutLine) {
        sum += arr[i]
    }

    println(Math.round(sum.toDouble() / (n - cutLine * 2)).toInt())
}

 

사실 이 문제 같은 경우는 아이디어와 구현 자체는 금방 했는데요.

계속 틀렸습니다를 받아 뭐지... 싶었는데

알고보니 코틀린의 round 함수는 사사오입이 아닌 오사오입 방식이였습니다.

1.5의 경우 2

2.5의 경우 2

3.5의 경우 4

4.5의 경우 4

이와 같이, 5에서 반올림을 할 경우, 앞자리 숫자가 홀수냐 짝수냐에 다라 내림 올림이 결정되는 것이 오사오입 입니다.

일상에서 흔히 사용하는, 5면 앞자리가 홀수던 짝수던 올림처리하는 방식은 사사오입이라 합니다.

파이썬 역시 오사오입이라 반올림을 처리할 때 애먹었던 기억이 있었는데,

왜 자꾸 틀리나 싶었는데 코틀린의 round 역시 오사오입 이였네요.

 

결국 java.lang의 Math.round를 갖다 사용하였더니 통과하였습니다.

profile

Uknow's Lab.

@유노 Uknow

인생은 Byte와 Double 사이 Char다. 아무말이나 해봤습니다.