[백준] 문자 인식 (3448)(kotlin)

문제 설명

백준 3448번 문제 링크

입력 및 출력

» 입력

입력은 N개의 테스트 케이스로 구성되어 있다. 첫째 줄에 테스트 케이스의 개수 N이 주어진다. 각 테스트 케이스는 적어도 한 줄이고, 인식하지 못한 문자는 ‘#’로 표시한다. 각 테스트 케이스의 다음에는 빈 줄이 한 칸씩 있다. 각 줄은 100글자를 넘지 않고, 줄의 수도 200줄을 넘지 않는다.

» 출력

각 테스트 케이스에 대해서 인식률을 계산한 뒤 다음과 같이 출력한다. 각 줄은 “Efficiency ratio is X%.”와 같은 형태로 출력해야 한다. X는 인식률을 퍼센트로 표시한 것이고, 소수점 두자리 이상인 경우에는 둘째 자리에서 반올림해서 출력한다. 단, 반올림 결과가 정수이면 정수 부분만 출력한다.

예제 입출력(테스트케이스)

입력 출력
3
Pr#nt ex##tly one##ine for#eac# te#t c#se.

None.

The i#put consists of
N test ca#es. The number
of th#m (N) is given on
the first #ine
of the#input#file.
Efficiency ratio is 78.6%.
Efficiency ratio is 100%.
Efficiency ratio is 94%.

문제 풀이1

fun main(args: Array<String>) = with(System.`in`.bufferedReader()) {
    val N = readLine().toInt()

    repeat(N) {
        var totalChar = 0
        var unrecognizedChar = 0

        while (true) {
            val str = readLine()
            if (str.isNullOrEmpty()) break

            totalChar += str.length
            unrecognizedChar += str.count { it == '#' }
        }

        val ratio = (totalChar.toDouble() - unrecognizedChar) / totalChar.toDouble() * 100.0
        val ratioRound = "%.1f".format(ratio)
        val ratioRoundToInt = ratioRound.toDouble().toInt()

        println(
            "Efficiency ratio is " +
                    if (ratioRound != "$ratioRoundToInt.0") "%.1f".format(ratio)
                    else { "${ratioRoundToInt}" } + "%."
        )
    }
}

//    println("%.1f".format(99.95f)) -> "99.9"
//    println("%.1f".format(99.95)) -> "100.0"