본문 바로가기
스터디(beakjoon)

Kotlin] 백준 4344번 문제풀이

by 김마리님 2023. 6. 8.

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

 

4344번: 평균은 넘겠지

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

www.acmicpc.net

 

 

풀이

더보기

이 문제는 배열을 얼마나 잘 다루는가에 대한 문제이다.

 

먼저 첫 줄을 케이스로 받고, 해당값으로 반복문의 끝을 걸어두고 반복문을 돌린다.

내부에서 입력을 한 번 더 받고, 이를 공백으로 split한 후에, 이 배열을 숫자계산을 할 것이므로 .map { it.toInt() } 를 통해 배열을 전부 int 자료형으로 변경한다.

이제 배열의 형태는 [5, 50, 50, 70, 80, 100] 의 형태로 되어있을텐데, 앞은 학생 수, 뒤는 점수들이다.

이를 두 배열로, 정확히는 앞의 배열을 빼버리기 위해 subList를 이용해 자른다.

이 때, 주의해야할 점은 subList의 인덱스인데, 이 인덱스를 고려할 때는, '어디에 칼을 넣는가' 를 고려해야한다는 점이다.

따라서, 예시를 보면 배열의 0번째를 제외하고 자르고 싶다면 1번 인덱스에 첫번째로 칼을 넣고, 6번 인덱스에 마지막으로 칼을 넣으면 배열이 원하는데로 잘린다. 6은? 잘 보면 배열의 전체 크기와 맞는다는 것을 알 수 있다.

따라서, array.subList(1, array.size)를 하면 된다.

이제 학생 수와 점수배열을 만들었다면, 평균은 전체 값의 합산 / 학생 수를 하면 된다. 이 때, array.sum() 함수를 하면 배열의 전체 값을 더할 수 있다.

 

마지막으로 평균을 구할 때 소수점 세 자리 수로 구해야하므로,

1. 먼저 평균을 넘는 학생을 구한다.

이 것은 array.count { it > avaerage } 를 통해 {} 내부에 내가 원하는 카운트 조건을 넣음으로서 구할 수 있다.

2. 평균을 넘는 비율을 구한다.

1에서 구한 값 / 전체 학생 수 를 하면 되는데, 이 때, 우리가 구해야하는 것이 소수점이므로, 1에서 구한 값이나 전체 학생수를 toFloat()를 통해 Float 자료형으로 변경해주어야 한다.

3. 2의 값에 100을 곱해 퍼센테이지로 변경한다.

4. 3의자리에서 반올림한다.

String.format("%.(원하는 소수점)f), 퍼센테이지")를 하면 원하는 소수점에서 반올림된 값을 구할 수 있다.

 

이를 전체 식으로 보면

fun main(args: Array<String>) {
    question4344()
}

fun question4344() {
    var readLine = readLine()!!.toInt()

    for(i in 1 .. readLine) {
        var case = readLine()!!.split(" ").map { it.toInt() }
        var students = case[0]
        var grades = case.subList(1, case.size)

        var average = grades.sum() / students

        var percentage = grades.count { it > average }.toFloat() / students * 100
        println("${String.format("%.3f", percentage)}%")
    }
}
반응형