본문 바로가기

알고리즘

[백준][KOTLIN] 2108 통계학

728x90

풀이

  1. 입력을 받아 산술 평균, 중앙값, 범위를 정의에 따라 구한다.
  2. 최빈 값을 구하기 위해서 입력된 수의 범위가 4000보다 작은 정수이므로 입력된 정수를 저장하는 빈 배열(크기 8001, 초기 값 0) 을 선언한다.
  3. 입력된 정수를 index 로 하여 2번에서 정의한 배열의 값을 증가 시킨다. 이때 음의 정수일 경우 (4000 - input) 으로 index 를 처리 한다.
  4. 입력된 정수를 저장한 배열을 이용하여 최빈값(max) 의 크기를 찾는다.
  5. 입력된 정수를 저장한 배열을 검색하여 최빈값의 크기와 같은 값일 경우 해당 index 를 저장한다.
  6. 5번에서 저장한 값이 2개 이상일 경우 1번째를 출력하고 아닐 경우 0번째를 출력한다.

코드

import java.io.*
import java.util.*
import kotlin.math.roundToInt

fun main(args: Array<String>) {
    val br = BufferedReader(InputStreamReader(System.`in`))
    val bw = BufferedWriter(OutputStreamWriter(System.out))
    val n = br.readLine().toInt()
    val inputs = IntArray(n) {
        br.readLine().toInt()
    }

    Arrays.sort(inputs)

    var avg = 0.0
    var mid = inputs[(n - 1) / 2]
    var mode = 0
    var range = inputs[n - 1] - inputs[0]
    var sum = 0

    // 최빈값 저장 리스트
    var modeList = IntArray(8001) { 0 }

    for (num in inputs) {
        sum += num

        if (num < 0) modeList[4000 - num]++
        else modeList[num]++
    }

    avg = sum / n.toDouble()

    // 최빈값 구하기
    val modeResult = mutableListOf<Int>()
    var max = Int.MIN_VALUE

    for (mod in modeList) {
        if (mod != 0 && max < mod) {
            max = mod
        }
    }


    for ((idx, mod) in modeList.withIndex()) {
        if (mod == max) {
            if (idx > 4000) modeResult.add(4000 - idx)
            else modeResult.add(idx)
        }
    }

    Collections.sort(modeResult)

    mode = if (modeResult.size > 1) modeResult[1] else modeResult[0]

    println(avg.roundToInt())
    println(mid)
    println(mode)
    println(range)
}
728x90