문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 ["sun", "bed", "car"]이고 n이 1이면 각 단어의 인덱스 1의 문자 "u", "e", "a"로 strings를 정렬합니다.
fun solution(strings: Array<String>, n: Int) = strings.sortedBy { it[n] }.toTypedArray()
sortedBy를 써서 n번째 문자를 기준으로 정렬 시켰다
그런데 문제가 생겼다
n번째 문자가 같을 경우 사전순으로 문자열을 또 정렬하는건데 이걸 잊고있었다
fun solution(strings: Array<String>, n: Int) = strings.sortedWith(compareBy({ it[n] }, { it })).toTypedArray()
이번엔 sortedWith()
함수를 배워서 이용해봤다
it[n]로 먼저 각 문자열을 정렬하고 그 뒤 it을 추가해 사전순으로 정렬하게 했다.
fun solution(strings: Array<String>, n: Int): Array<String> {
return strings.also {
it.sort()
it.sortBy { it[n] }
}
}
그냥 처음에 사전순으로 정렬하고 그 뒤 n번째 문자를 정렬하면 끝
sortedWith
함수는 Kotlin에서 리스트를 정렬할 때 사용되는 함수이다.
함수는 비교 기준을 정의하는 함수를 인자로 받는다.
이 함수는 두 요소를 비교하고, 첫 번째 요소가 두 번째 요소보다 작으면 음수, 같으면 0, 크면 양수를 반환한다.
이 반환값에 따라 정렬이 이루어진다
fun main() {
val matrix = arrayOf(
arrayOf(3, 1, 4),
arrayOf(1, 5, 9),
arrayOf(2, 6, 5)
)
val col = 0 // 첫 번째 열을 기준으로 정렬
val sortedMatrix = matrix.sortedWith(compareBy { it[col] })
// 결과 출력
sortedMatrix.forEach { row ->
println(row.joinToString(", "))
}
}
1, 5, 9
2, 6, 5
3, 1, 4 //결과
fun solution(matrix: Array<IntArray>): Array<IntArray> {
return matrix.sortedWith(compareBy({ it[1] }, { it[0] })).toTypedArray()
}
fun main() {
val matrix = arrayOf(
intArrayOf(3, 1, 4),
intArrayOf(4, 5, 9),
intArrayOf(2, 6, 5),
intArrayOf(1, 5, 1) // 두 번째 열의 숫자가 5로 같음
)
val sortedMatrix = solution(matrix)
// 결과 출력
sortedMatrix.forEach { row ->
println(row.joinToString(", "))
}
}
3, 1, 4
1, 5, 1
4, 5, 9
2, 6, 5 //결과
처음에 정렬하고 같은 값이나와서 정렬하지 않았을때 추가로 정렬해줄수도 있다
위코드에서 4,5,9와 1,5,1이 2번째 열의 숫자가 같아 첫번째열의 숫자를 비교해서 추가로 정렬했다.