본문 바로가기
  • 개발하는 곰돌이
Algorithm/BOJ

[Kotlin] 백준 15595 : 정답 비율 계산하기

by 개발하는 곰돌이 2022. 12. 10.

문제 링크

 

15595번: 정답 비율 계산하기

첫째 줄에 어떤 문제의 총 제출 횟수 N(1 ≤ N ≤ 200,000)이 주어진다. 둘째 줄부터 N개의 줄에 각 제출의 정보가 제출 번호 순서대로 주어진다. 제출 정보는 총 7가지가 공백 하나로 구분되어져 있

www.acmicpc.net



문제 해설

BOJ의 정답 비율을 계산하는 알고리즘을 직접 구현해보는 문제다. 입력에 많은 정보가 있지만 문제의 조건을 봤을 때 필요한 것은 문제를 맞은 사람의 수, 문제를 맞은 사람이 이전까지 틀린 횟수, 문제를 맞은 사람의 유저 아이디만 있으면 된다.

 

우선 문제를 맞은 사람이 이전까지 틀린 횟수를 계산하기 위해 HashMap을 사용했다. 문제를 아무리 많이 틀려도 해당 유저 아이디가 최종적으로 문제를 맞추지 못한다면 분모에 포함하지 않고, 해당 유저 아이디가 문제를 맞춘 이후에 틀린 횟수 또한 분모에 포함하지 않으므로 이 부분에서 제어문을 통해 계산을 한다.(코드 10~16번째 줄) 

 

HashMap에는 문제를 맞춘 유저 아이디가 관리자 아이디("megalusion")인 경우를 제외하고 유저 아이디를 key로 하고 문제를 맞추기 전까지 틀린 횟수를 value로 저장한다. 이를 위해 문제를 맞췄을 경우에는 해당 유저 아이디에 해당하는 value를 분모로 사용할 틀린 횟수의 총합에 더한 후 별도의 값으로 변경하고 결과가 4가 아닌 모든 경우에 대해 해당 유저 아이디에 해당하는 value가 맞춘 경우에 해당하는 별도의 값이 아닌 경우에 1씩 증가시킨다.(코드 상에서는 0을 사용)

 

최종적으로 문제를 맞은 사람의 수는 맵에서 value가 0인 key의 개수에 해당한다. 분모가 될 (문제를 맞은 사람의 수 + 맞은 사람이 문제를 맞기 전까지 틀린 횟수의 총합)이 0인 경우에는 0을 출력하고 그 외의 경우에는 문제의 조건대로 계산하여 실수형으로 출력하면 된다.


Code

import java.util.StringTokenizer

fun main() = with(System.`in`.bufferedReader()) {
    val submit = HashMap<String, Int>()
    var wrong = 0
    repeat(readLine().toInt()) {
        StringTokenizer(readLine()).run {
            nextToken()
            val id = nextToken()
            when (nextToken()) {
                "4" -> if (id != "megalusion") {
                    wrong += submit[id] ?: 0
                    submit[id] = 0
                }
                else -> if (submit[id] != 0) submit[id] = submit[id]?.plus(1) ?: 1
            }
        }
    }
    val correct = submit.filter { it.value == 0 }.size
    println(if (correct + wrong == 0) 0 else (correct.toDouble() / (correct + wrong)) * 100)
}

댓글