Uknow's Lab.
article thumbnail

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

 

4344번: 평균은 넘겠지

대학생 새내기들의 90%는 자신이 반에서 평균은 넘는다고 생각한다. 당신은 그들에게 슬픈 진실을 알려줘야 한다.

www.acmicpc.net

 

난이도 : 브론즈 1
태그 : 수학, 사칙연산

 

 

설명

예전에 푼 문제였던 것 같은데,

오늘 확인해보니 갑자기 틀렸습니다로 뜨길래 뭔가 했더니, 테스트 케이스가 추가되어 재채점 되었더군요.

 

코틀린 혹은 파이썬으로 해당 문제를 풀 경우 애로사항 중 하나가 바로 반올림하는 부분일 것 같습니다.

 

 

이전에 포스팅했던 내용인 오사오입 방식 때문인데요.

https://uknowblog.tistory.com/338

 

코틀린의 반올림 방식 : 오사오입

kotlin.math.round()... 뭔가 이상한데? https://uknowblog.tistory.com/337 [백준 18110번] [Kotlin] solved.ac https://www.acmicpc.net/problem/18110 18110번: solved.ac 5명의 15%는 0.75명으로, 이를 반올림하면 1명이다. 따라서 solved.a

uknowblog.tistory.com

 

대충 요약하자면, 2.5를 반올림하면 2, 3.5를 반올림하면 4, 4.5를 반올림하면 5, 5.5를 반올림하면 5와 같이

5를 반올림 할 때, 짝수를 향하도록 반올림을 하는 방법입니다.

 

 

 

소스코드

import java.lang.StringBuilder
import kotlin.math.roundToInt

fun main() = with(System.`in`.bufferedReader()) {
    val n = readLine().toInt()
    val sb = StringBuilder()
    repeat(n) {
        val arr = readLine().split(" ").map { it.toInt() }
        val avg = (arr.sum() - arr[0]) / arr[0]
        var count = 0
        for (i in 1..arr[0]) {
            if (arr[i] > avg) count++
        }

        sb.append("${String.format("%.3f", (count.toDouble() / arr[0] * 100000.0).roundToInt() / 1000.0)}%\n")
    }
    print(sb)
}

 

코틀린의 roundToInt는 사사오입 방식으로 반올림을 할 때 쓰이지만,

소숫점 몇 번째 자리에서 반올림하는게 아니라,

소숫점 첫 번째 자리에서 반올림하여 Int(혹은 Long)으로 만들기에,

사사오입을 위해 roundToInt를 사용하면서, 소숫점 4번째 자리에서 반올림하기 위해

1000을 곱한 뒤 반올림하여 다시 1000으로 나누었습니다.

profile

Uknow's Lab.

@유노 Uknow

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