프로그래머스 - 상호평가 (kotlin)

silver·2021년 8월 9일
0

[문제 내용]
학생들이 본인을 포함하여 서로 평가를 한다.
본인이 본인을 평가한 점수가 가장 높거나, 가장 낮을 경우
해당 점수는 포함하지 않고 평균을 구하는데
여기서 그 점수가 평가당한 점수들중 유일한 점수가 아니라면 포함한다.
위의 규칙을 이용해 A~F까지 학점을 매겨서 반환하는것이 문제이다.

[example 1]

[[100,90,98,88,65],[50,45,99,85,77],[47,88,95,80,67],[61,57,100,80,65],[24,90,94,75,65]]	
 -> "FBABD"
[[50,90],[50,87]]	
 -> "DA"
[[70,49,90],[68,50,38],[73,31,100]]	
 -> "CFD"

[해결 방법]
일단 문제를 해결하긴 하였지만,
다른 사람의 코드를 구경하다가
더 좋은 코드가 있어서
그 코드를 가져와보았다.

일단 세로로 행렬을 읽어야 하기때문에,
세로로 해당 점수를 읽어오고,
그 점수들중 본인이 부여한 점수와 같은 것이 있으면
flag값을 올려준다.

그리고 본인이 부여한 점수가 유일한 최댓값 또는 유일한 최솟값을 만족하면
그 점수는 제거한다.
(근데 여기서 아쉬운 점은 자신과 같은 점수를 부여한 사람이 한사람이라고 가정한 부분이 아쉽다.)

그리고 해당 점수의 평균을 구해
해당 범위의 학점을 부여한다.

나도 위와 같은 방식으로 풀었지만,
같은 방식을 이런식으로 더 kotlin스럽게 풀 수 있구나 싶어서 가져와보았다.

class Solution {
    fun solution(scores: Array<IntArray>): String {
    return scores.mapIndexed { index, ints ->
        var flag = 0
        var list = arrayListOf<Int>().also { (scores.indices).map { v -> it.add(scores[v][index]) } }
        list.forEach { if (it == ints[index]) flag++ }
        if ((list.max() == ints[index] || list.min() == ints[index]) && flag == 1)
            list.remove(ints[index])
        list.sum() / list.size.toDouble()
    }.joinToString("") {
        when {
            it >= 90 -> "A"
            it >= 80 -> "B"
            it >= 70 -> "C"
            it >= 50 -> "D"
            else -> "F"
        }
    }
}

0개의 댓글