주어진 배열에 들어있는 숫자들을 조합해서 가장 큰수를 만들어야하는 문제다
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