본문 바로가기
Algorithm

[Algorithm] 프로그래머스 가장 큰 수(2) - Kotlin

by 준그래머 2021. 3. 27.
반응형

이전 글

 

프로그래머스 가장 큰 수(1) - Kotlin

프로그래머스의 정렬 문제 중 Level 2문제인 가장 큰 수에 대해 정리해보려 한다. 코딩 테스트 연습 - 가장 큰 수 | 프로그래머스 (programmers.co.kr) 코딩테스트 연습 - 가장 큰 수 0 또는 양의 정수가

junyoeng.tistory.com

 

이번 포스팅에선 다른 분들이 만든 성공 케이스를 두 가지 정도 뽑아서 정리해보려 한다.

 

먼저 첫 번째로 sortedWith()를 이용해 숫자를 문자열로 앞 뒤로 교차해서 비교한 뒤 정리하고 정리가 끝난 후에 forEach()를 통해 인덱스 순서대로 하나 씩 더해서 문자열을 완성시키는 방식으로 해결하고 있다. 0이 반복적으로 나오는 경우를 처리하기 위해 '0'으로 시작하는 문자열이 있으면 "0"으로 치환하는 예외처리도 구현하여 문제를 해결하였다.

fun solution1(numbers: IntArray): String {
    var answer = ""
    numbers.sortedWith(Comparator({num1: Int, num2: Int -> "$num2$num1".compareTo("$num1$num2")})).forEach { answer += it }
    if ("(0*)".toRegex().replace(answer, "").isEmpty()) {
        answer = "0"
    }
    return answer
}

 

두 번째는 sortedByDescending()을 이용해 내림차순으로 정렬하는데, 이때 padEnd를 통해 '%'를 추가해 4자리로 만들어주고 '%'가 들어가는 자리에는 원래 문자열이 들어간다. (ex "10" -> "10%%" -> "101010") 이렇게 변한 값을 내림차순으로 변환하는데, Comparable를 이용해 비교하는 방식을 사용하기 때문에 String 간 비교할때 앞 자리부터 하나씩 비교하고 더 큰 수가 있는 경우 그 값을 1로 반환해서 정렬한다. 이해가 되지 않는다면 compareTo()를 정리한 포스팅이 있으니 참조하면 될거 같다.

fun solution2(numbers: IntArray): String {
    var answer = ""
    //문자열로 변환 및 마지막 자리를 pad로 채워 정렬
    numbers.sortedByDescending {
        it.toString().padEnd(4,'%').replace("%",it.toString())
    }.forEach{
        answer += it
    }
    //정규식 사용하여 00000...을 0으로 변환
    var patten = "[1-9]".toRegex()
    if(!patten.containsMatchIn(answer)){
        answer = "0"
    }
    return answer
}

 

반응형