문제 링크 -> https://programmers.co.kr/learn/courses/30/lessons/42746
코딩테스트 연습 - 가장 큰 수
0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰
programmers.co.kr
0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.
예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.
0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.
제한 사항
- numbers의 길이는 1 이상 100,000 이하입니다.
- numbers의 원소는 0 이상 1,000 이하입니다.
- 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.
입출력 예
numbers | return |
[6, 10, 2] | "6210" |
[3, 30, 34, 5, 9] | "9534330" |
처음에 뭐야 간단하네 하고 풀다가 뒤통수 씨게 맞았다..
------------------------------------------------------------------------------------------------------------------------------
첫 번째로 실행했던 방법
- 내림차순으로 정렬해서 string으로 반환
* 테스트 케이스 조차 통과 못함..
두 번쨰로 실행했던 방법
- 내림차순으로 정렬한 후, sortedwith에 길이로 오름차순 정렬
- numbers의 n과 n-1을 붙여서 n+(n-1)과 (n-1)n중 더 큰 것에 따라 로직을 다르게 구현해서 string조합
* 테스트 케이스는 통과하지만, 제출하면 실패 퍼레이드...
이러고 몇시간 삽질하다가 결국 정답을 보았다..
class Solution{
fun solution(numbers: IntArray): String {
val new = numbers.sortedWith( Comparator { t, t2 ->
(t2.toString()+t.toString()).compareTo(t.toString()+t2.toString()) //두 값을 비교 int값을 기준을 정렬을 실행
})
if( new[0] == 0) return "0"
else return new.toString().replace( Regex("[^0-9]"), "")
}
}
정답을 보고 아 저렇게 정렬조건을 주면 되는구나 했는데
val new = numbers.sortedWith( Comparator { t, t2 ->
(t2.toString()+t.toString()).compareTo(t.toString()+t2.toString()) //두 값을 비교 int값을 기준을 정렬을 실행
})
이부분이 너무 궁금해졌다..
먼저 Comparator에 대해 찾아보았다. https://developer.android.com/reference/kotlin/java/util/Comparator를 보면 컬렉션에 대해 순서를 부과한다고 설명되어있다.
그럼 위 코드에서 t와 t2는 compareTo의 반환값에따라 순서가 부여된다.
compareTo는 https://junyoeng.tistory.com/32이분의 게시물에서 너무 잘 설명되어있다. 참고하시길.
그런데 여기서 난 어떻게 순서가 부여되는지 알고 싶어서 이곳저곳 더 찾아보고 오픈채팅방에도 물어봤는데 원하는 답이 안나온다.. 그래서 비교하는 t와 t2를 뽑아 보았다.
중간에 34와 30을 두번 비교하는데 이거만 아니면 아래 표처럼 이해하겠는데 저것 때문에 더 모르겠다..
혹시 로직을 정확히 아시는분이 있으시거나 정리된 글 링크를 아신다면 댓글 남겨주세요 ㅜㅜ
------------------------------------------------------------결과------------------------------------------------------------------
내가 푼 문제가 아니므로 결과 생략...
- 문제에 대한 질문 댓글 환영!
- 중간에 잘못된 부분이 있다면 댓글로 남겨주세요. 수정하겠습니다.
'Kotlin(프로그래머스) > Level 2' 카테고리의 다른 글
[프로그래머스/Kotlin] JadenCase 문자열 만들기 (0) | 2022.04.18 |
---|---|
[프로그래머스/Kotlin] N개의 최소 공배수 (0) | 2022.04.18 |
[프로그래머스/Kotlin]거리두기 확인하기 (0) | 2022.04.15 |
[프로그래머스/Kotlin] 괄호 변환 (0) | 2022.04.14 |
[프로그래머스/Kotlin] 메뉴 리뉴얼 (0) | 2022.04.11 |
댓글