[Kotlin] data class 정렬 하는 방법 feat. Programmers 복서 정렬하기

2021. 9. 13. 14:51[Algorithm] 알고리즘 정리 - Kotlin

반응형

안녕하세요. 커스텀하여 사용하는 data class를 정렬 하는 방법에 대해서 알아보겠습니다.

 

관련 문제

https://programmers.co.kr/learn/courses/30/lessons/85002

 

코딩테스트 연습 - 6주차_복서 정렬하기

복서 선수들의 몸무게 weights와, 복서 선수들의 전적을 나타내는 head2head가 매개변수로 주어집니다. 복서 선수들의 번호를 다음과 같은 순서로 정렬한 후 return 하도록 solution 함수를 완성해주세요

programmers.co.kr

전체 코드

class Solution {
fun solution(weights: IntArray, head2head: Array<String>): ArrayList<Int> {
    var answer = ArrayList<Int>()
    var list = Array<information>(weights.size){ information() } // 승률 복서이긴횟수 몸무게

    for(i in head2head.indices) {
        var stadium = head2head[i]
        list[i].weight = weights[i]
        list[i].number = i
        var winCnt = 0
        var lostCnt = 0
        for(j in stadium.indices) {
            if(stadium[j] == 'W') {
                winCnt++
                if(weights[i] <weights[j]) {
                    list[i].winCount++
                }
            }
            else if(stadium[j] == 'L') {
                lostCnt++
            }
        }
        if(winCnt == 0 && lostCnt == 0) {
            list[i].count = 0.0
        }
        else {
            list[i].count = (winCnt.toDouble()/(winCnt.toDouble()+lostCnt.toDouble()))
        }
    
    }
    var list1 = list.sortedWith(compareByDescending(information::count).thenByDescending(information::winCount).thenByDescending(information::weight).thenBy(information::number))


    list1.forEach { println(it) }

 for(i in list1.indices) {
     answer.add(list1[i].number +1)
     print(answer[i])
 }

    return answer
}
data class information (var count: Double = 0.0, var winCount: Int = 0, var weight: Int = 0, var number: Int = 0)
}

정렬의 기준이 하나일 때

data class에 count와 wincount, weight, number 4가지 변수가 있습니다.

이 데이터 값을 count를 내림차 순으로 정렬 해보겠습니다.

list.sortByDescending (information::count)

count를 기준으로 내림차순으로 정렬 된 모습

반대로 오름차순으로 정렬 해보겠습니다.

list.sortBy(information::count)

정렬의 기준이 두 개 이상일 때

count를 먼저 내림차순으로 정렬하고 winCount를 내림차순으로 정렬하고 weight을 내림차순으로 정렬하고 number를 오름차순으로 정렬하려면 어떻게 해야 할까요?

    list.sortWith(compareByDescending(information::count).thenByDescending(information::winCount).thenByDescending(information::weight).thenBy(information::number))

로 하면 ..!

 

Sorted VS Sort

우선 SortWith의 레퍼런스를 참고해보면

public fun <T> kotlin.Array<out T>.sortWith(comparator: kotlin.Comparator<in T>

T라는 타입으로 들어와서 정렬한 후 T로 나가네요 

이 말은 해당 list를 sort 해주는거예요

예를들어서 var list = list.sort() 이런 작업이 필요 없고 list.sort()만으로 내부적으로 정렬이 되죠

SortedWith의 레퍼런스를 참고해보면

public fun <T> Array<out T>.sortedWith(comparator: Comparator<in T>): List<T> {
return sortedArrayWith(comparator).asList()
}

T라는 타입으로 들어와서 List<T>라는 타입으로 나가게 돼요. 그러면 list.sortedWith()를 하게 된다면 새로운 리스트로 반환이 되는거기 때문에 var list1 = list.sortedWith()라는 대입의 작업이 필요하게 됩니다 ! 

ed의 차이 잘 아시겠나요?! 

반응형