2021. 9. 13. 14:51ㆍ[Algorithm] 알고리즘 정리 - Kotlin
안녕하세요. 커스텀하여 사용하는 data class를 정렬 하는 방법에 대해서 알아보겠습니다.
관련 문제
https://programmers.co.kr/learn/courses/30/lessons/85002
전체 코드
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)
반대로 오름차순으로 정렬 해보겠습니다.
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의 차이 잘 아시겠나요?!
'[Algorithm] 알고리즘 정리 - Kotlin' 카테고리의 다른 글
[Algorithm] N개의 최대공약수, 최소공배수 - 유클리드 호제법, Kotlin (0) | 2021.11.05 |
---|---|
[Kotlin] Collections Map에 대한 모든 사용법 (0) | 2021.08.16 |