스터디(beakjoon)

Kotlin] 백준 11650번 풀이

김마리님 2024. 3. 14. 10:11

https://www.acmicpc.net/problem/11650

 

11650번: 좌표 정렬하기

첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.

www.acmicpc.net

 

 

더보기

이 문제는 다중정렬 문제이다.

x를 먼저 정렬하고, x값이 같다면 y를 정렬해야하는.

 

코틀린에는 다중정렬에 대한 매서드가 존재한다.

list.sortWith(compareBy)
list.sortedWith(compareBy)

 

-ed의 차이는.. 거 다른 정렬함수랑 같이 sortWith는 기존 리스트를 정렬하고, sortedWith는 정렬된 새로운 객체를 만든다.

compareBy 내부에 정렬 기준을 정한다. 정렬 우선순위 기준으로 기준을 넣으면 된다.

예를 들어, Pair을 가진 리스트의 a 값을 먼저 정렬하고, a값이 같다면 b를 정렬한다 가정하면,

list.sortedWith(compareBy({it.first}, {it.second}))
list.sortWith(compareBy({it.first}, {it.second}))

 

이렇게 이용하면 쉽게 다중정렬할 수 있다.

 

 

이를 이용해서 이번 문제를 풀면 ,,

fun main(args: Array<String>) {
    question11650()
}

fun question11650() {
    val count = readln().toInt()
    val list = mutableListOf<List<Int>>()
    for (i in 1 .. count) {
        list.add(readln().split(" ").map { it.toInt() })
    }

    list.sortedWith(compareBy({it[0]}, {it[1]})).forEach {
        println(it.joinToString(" "))
    }
}

 

 

다중정렬이 정렬 후 값을 또 정렬하는 형태라 시간복잡도를 크게 가져가는건 어쩔수 없나 싶기도(..

 

반응형