https://www.acmicpc.net/problem/4344
풀이
이 문제는 배열을 얼마나 잘 다루는가에 대한 문제이다.
먼저 첫 줄을 케이스로 받고, 해당값으로 반복문의 끝을 걸어두고 반복문을 돌린다.
내부에서 입력을 한 번 더 받고, 이를 공백으로 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)}%")
}
}
'스터디(beakjoon)' 카테고리의 다른 글
Kotlin] 백준 2941번 문제풀이 (1) | 2023.06.09 |
---|---|
Kotlin] 백준 1157번 문제풀이 (0) | 2023.06.08 |
Kotlin] 백준 2444번 문제풀이 (1) | 2023.06.07 |
Kotlin] 백준 10988번 문제풀이 (0) | 2023.06.07 |
Kotlin] 백준 25083번 문제풀이 (0) | 2023.06.02 |