프로그래머스 가장 큰 수-level3

수뱀 ㅣ 2025. 4. 2. 14:53

주어진 배열에 들어있는 숫자들을 조합해서 가장 큰수를 만들어야하는 문제다

 

https://school.programmers.co.kr/learn/courses/30/lessons/42746

 

예를들어 

[[9].[5],[43],[32]] 가 주어졌다면 

954332 가 반환되어야한다

 

처음 접근은 일단 앞자리가 9인숫자부터 1인숫자까지 정렬해서 붙이려고했지만..

 

[34],[30],[3] 이라는 앞자리가 3인 숫자들이 주어졌을때 처리하는방법을 몇시간동안 고민하다 찾지못하여 혼자힘으로는 푸는거에 실패했다

 

하지만 코틀린에 sortedWith와 copareTo()로 진짜 간단하게 푸는 방법이 존재했다...

 

먼저 compareTo() 함수부터 알아보자

fun main(){
    
    val a = 10
    val b = 20

    println(a.compareTo(b)) // -1
    println(b.compareTo(a)) //  1

}

 

x.compareTo(y) 일때 x가 y보다 작다면 -1을 , 크다면 1을 반환한다

 

이걸 코틀린에서 리스트를 정렬하는 sortedWith() 함수에 적용하면

각각 비교하여 자동으로 정렬한다

 

정답

fun solution(numbers: IntArray): String {
    var result = numbers.map { it.toString() }
        .sortedWith { num1, num2 -> (num2 + num1).compareTo(num1 + num2) }
        .joinToString("")

    return if (result[0] == '0') "0" else result
}

 

3번째 줄에서 num1과 num2의 합(1+2 = 12)과 num2+num1(2+1 = 21)을 비교하여 더 큰쪽이 왼쪽에 정렬되게끔한다

 

numbers에 [[1].[5],[10]]이 주어졌다면

 

(1 + 5).compareTo(5 + 1) 우측이 더크니까 5가 1의 왼쪽에 위치한다

(5 + 10).compareTo(10 + 5) 이것도 마찬가지로 우측이 더크므로 5가 10왼쪽에 위치한다

(1 + 10).compareTo(10 + 1) 이건 110대 101로 우측이 더크므로 1이 10왼쪽에 위치한다

 

그리고 .joinToString()으로 문자열로만든다

 

풀이 출처:https://tsi0511.tistory.com/113

 

TIL 40일차 (가장 큰 수 - Kotlin | 챌린지반 3주차 세션 정리)

코드카타 가장 큰 수 문제 numbers의 최대 길이는 100,000이기에 주어진 수에서가능한 모든 순열을 만드는 방법은 시간초과를 발생시킨다.  입출력 예시 [0, 0, 0], 0   풀이class Solution { fun solution(

tsi0511.tistory.com