본문 바로가기
Kotlin(프로그래머스)/Level 2

[프로그래머스/kotlin] 가장 큰 수

by Yuno. 2022. 4. 17.
728x90

문제 링크 -> 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을 두번 비교하는데 이거만 아니면 아래 표처럼 이해하겠는데 저것 때문에 더 모르겠다..

혹시 로직을 정확히 아시는분이 있으시거나 정리된 글 링크를 아신다면 댓글 남겨주세요 ㅜㅜ 
------------------------------------------------------------결과------------------------------------------------------------------
내가 푼 문제가 아니므로 결과 생략...

- 문제에 대한 질문 댓글 환영!
- 중간에 잘못된 부분이 있다면 댓글로 남겨주세요. 수정하겠습니다.

728x90

댓글