알고리즘
[백준][KOTLIN] 2108 통계학
금님은님아부지
2021. 12. 6. 10:04
728x90
풀이
- 입력을 받아 산술 평균, 중앙값, 범위를 정의에 따라 구한다.
- 최빈 값을 구하기 위해서 입력된 수의 범위가 4000보다 작은 정수이므로 입력된 정수를 저장하는 빈 배열(크기 8001, 초기 값 0) 을 선언한다.
- 입력된 정수를 index 로 하여 2번에서 정의한 배열의 값을 증가 시킨다. 이때 음의 정수일 경우 (4000 - input) 으로 index 를 처리 한다.
- 입력된 정수를 저장한 배열을 이용하여 최빈값(max) 의 크기를 찾는다.
- 입력된 정수를 저장한 배열을 검색하여 최빈값의 크기와 같은 값일 경우 해당 index 를 저장한다.
- 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