프로그래머스 - 가장 큰 수

312·2023년 12월 20일

알고리즘-kotlin

목록 보기
5/9

가장 큰 수 - kotlin

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.

예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.

0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.

풀이 과정

단순히 끝자리에서부터 정렬하면 해결할 수 있는 문제라고 생각했다.
최대 4자리 수의 보기가 주어졌기 때문에, 해당 자리 수가 없는 경우에 0이라고 가정하고 끝 자리 수부터 정렬해봤다.

fun solution(numbers: IntArray): String {
    var answer = ""

    val list = numbers
        .sortedByDescending { it.toString().getOrElse(3) { '0' } }
        .sortedByDescending { it.toString().getOrElse(2) { '0' } }
        .sortedByDescending { it.toString().getOrElse(1) { '0' } }
        .sortedByDescending { it.toString().getOrElse(0) { '0' } }

    return list.joinToString("")
}

테스트 케이스 중, 절반은 맞고 절반은 틀리게 되었는데 0이 포함된 경우 해당 자리 수가 없는 경우와 동일하게 해석했기 때문에 이런 결과가 나왔다고 생각했다.

1차 수정 (정확성)

fun solution(numbers: IntArray): String {
    val numberList = numbers.map {
        val first = it.toString()[0].toString().toInt()
        Pair(
            it, when (it.toString().length) {
                1 -> it * 100 + it * 10 + it
                2 -> it * 10 + first
                3 -> it
                else -> it / 10
            }.toLong()
        )
    }.sortedByDescending { it.second }.toMutableList()

    if (numberList.first().first == 0) return "0"

    for (i in 0 until numberList.size - 1) {
        if (numberList[i].second == numberList[i + 1].second) {
            if ((numberList[i].first.toString() + numberList[i + 1].first.toString()).toLong() <
                (numberList[i + 1].first.toString() + numberList[i].first.toString()).toLong()
            ) {
                numberList.add(i, numberList.removeAt(i + 1))
            }

        }
    }

    return numberList.map { it.first }.joinToString("")
}

3자리 이하의 숫자에는 첫번째 수를 계속 이어주었고, 그 숫자가 같을때는 두 숫자를 이어붙인 수를 비교해서 큰 쪽을 우선적으로 배치하게끔 해주었다. 그러나 테스트케이스 1~6번을 통과하지 못했고, 질문하기에서도 답을 얻을 수 없었다.. 대신 약간의 힌트를 통해 코드를 다시 짤 수 있었다.

2차 수정 (정확성)

fun solution(numbers: IntArray): String {
    val numberList = numbers.sortedWith { first, second ->
        "$second$first".compareTo("$first$second")
    }

    if (numberList.first() == 0) return "0"

    return numberList.map { it }.joinToString("")
}

sortedWith를 통해 훨씬 간단하게 정렬할 수 있었다.
한 줄로도 작업할 수 있지만 가독성을 위해 남겨두기로 했다.
2차 수정을 하기까지 꼬박 하루동안 수많은 시행착오를 겪었고,
테스트케이스를 통과하지 못한 이유를 알게 된다면 추후에 수정하기로 마음먹었다..! ㅠ

profile
안드로이드 개발자 이상일입니다.

0개의 댓글