[kotlin] 가장 큰 수

KSang·2024년 4월 17일
0

[Kotlin]코드카타

목록 보기
99/100

문제 설명

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.

예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.

0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.

제한 사항
numbers의 길이는 1 이상 100,000 이하입니다.
numbers의 원소는 0 이상 1,000 이하입니다.
정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.

풀이

각 문자들의 크기를 정렬해주고 다시 정렬해주면 될 것 같다.

배열안에 숫자가 10, 200 이런 식으로 되어있는 것도 쪼개서 정렬해주는 메소드가 있나?

코틀린에서 그런 메소드는 없는 것 같다. 아마도?

정렬을 커스텀해서 사용해주자

fun solution(numbers: IntArray) =
    numbers.map { it.toString() }
        .sortedWith(compareByDescending<String> { it.repeat(4) }.thenByDescending { it })
        .joinToString("")

코틀린에서 .sortedWith 함수를 통해 커스텀 정렬을 할 수 있는대,
compareByDescending을 사용해 조건에 따라 내림차순으로 정렬한다.

제한사항에 원소의 길이가 1000 이하 여서 4번 반복해서 비교 한다.

repeat를 사용하는 이유는 숫자의 길이를 동일하게 만들어서 비교하는데,

예를 들어 3과 30의 경우 사전순으로 30이 3보다 앞서게 되어 303이라는 결과가 나타난다.

하지만 반복할경우 33, 3030이 되었을때 33이 사전순으로 앞서서 330이라는 결과를 반환할 것

그렇기 때문에 1000이하의 수가 제한 사항이니 repeat를 4번 해줘서 비교를 한다.

thenByDescendin을 사용해 첫 번째 비교 조건이 동일할 경우, 다시 내림 차순으로 정렬하면 된다.

중간에 오답이 하나 생겼는대, 아마 "0"으로만 이루어진 수를 나타 낼때 생긴 오답 같다.

문자열로 나타내니, 0,0,0,0 같은 경우 "0000"으로 나올 것 그냥 "0"으로 변경 시켜줄 필요가 있다.

    fun solution(numbers: IntArray): String {
        val answer = numbers.map { it.toString() }
            .sortedWith(compareByDescending<String> { it.repeat(4) }.thenByDescending { it })
            .joinToString("")
        
        return if(answer.startsWith("0")) "0" else answer
    }

0개의 댓글