문제 설명
0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.
예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.
0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.
문제 풀이 아이디어
사전식 정렬을 이용해서 문제를 풀 수 있다.
[6, 10, 2] 가 예제로 존재 할 때
6과 10으로 610과 106 조합을 만들 수 있다. 이 때 더 큰 값은 610 이므로 6,10,2 순서를 유지한다.
10과 2 로 102와 210 조합을 만들 수 있다. 이 때 더 큰 값은 210 이므로 6,2,10로 순서를 바꾼다.
6과 2로는 62와 26 조합을 만들 수 있다. 이 때 더 큰 값은 62 이므로 6,2,10 순서를 유지한다.
이렇게 유지된 배열의 값을 joinToString("") 을통해서 합쳐진 하나의 값으로 return 한다.
이 때 예외상황으로 배열의 첫번째 원소 값이 0일 경우 최대 만들어질 수 있는 값은 0 ... 00 과 같은 수 이므로
"0"을 리턴하도록 한다.
코드
import java.util.*
class Solution {
object SortByNum : Comparator <String>{
override fun compare(o1: String?, o2: String?): Int {
return (o2+o1).toInt().compareTo((o1+o2).toInt())
}
}
fun solution(numbers: IntArray): String {
var numberString :MutableList<String> = mutableListOf()
numbers.forEach{
numberString.add(it.toString())
}
var answer = numberString.sortedWith(SortByNum)
if (answer[0] == "0") {
return "0"
}
return answer.joinToString("")
}
}
배운점
- 코틀린의 compare 함수를 만들고 적용하는 방법에 대해서 알게되었다. array.sortedWith() 하고 괄호에 Comparator를 넣어주면 된다.
- 람다식으로 Comparator를 만들 수도 있고, 위 코드처럼 object로 Comparator를 상속 받아 override 함수로 compare 함수를 작성할 수 있다.
람다식으로 compartor 만든 예시
class SolutionKt {
fun solution(numbers: IntArray): String {
var answer = ""
numbers.sortedWith(Comparator { o1, o2 -> "$o2$o1".compareTo("$o1$o2") }).forEach { answer += it }
return if(answer.startsWith("0")) "0" else answer
}
}
- a.compareTo(b) 함수에 대해서 알게되었다. 매개변수로 a,b를 주고 return a.compareTo(b)를 할 경우 오름차순, return b.compareTo(a) 경우 내림차순으로 정렬한다는 의미이다.
위 코드에서는 o1이 먼저 있으므로 내림차순 정렬을 하기위해서는 (o2+o1).compareTo(o1+o2)를 작성해야했다.
'알고리즘 > 문제풀이 (C++,Kotlin)' 카테고리의 다른 글
[프로그래머스/Kotlin] Lv2 타겟 넘버 : BFS (0) | 2023.09.07 |
---|---|
[프로그래머스/Kotlin] Lv2 소수찾기 : 완전탐색 (0) | 2023.09.05 |
[프로그래머스/Kotlin] Lv2 프로세스 : Queue (0) | 2023.08.31 |
[우테코/Kotlin] 우아한 테크코스 온보딩 풀이 및 공부 (0) | 2023.08.14 |
[BOJ/C++] 10974번 모든 순열 (0) | 2023.03.15 |