Kotlin/Algorithm Problems

<프로그래머스> 가장 큰 수(Lv.2)

re트 2023. 12. 1. 11:16
728x90

[깃허브]

https://github.com/heesoo-park/ForCodeKata/tree/main/%EA%B0%80%EC%9E%A5%20%ED%81%B0%20%EC%88%98

[프로그래머스]

https://school.programmers.co.kr/learn/courses/30/lessons/42746

 

이 문제는 제대로 막혔다.

문제를 보고 문자열로 정렬을 해서 값을 내야한다고 생각이 들었지만 그 정렬 방법이 떠오르지 않더라 

첫째자리수 비교, 길이 비교 이런 식으로 처음에 했었는데 이렇게 하면 자릿수마다 다 비교를 해야해서 시간이 늘어날 것이었다.

그리고 예외 케이스도 존재했다.

예제에서 34 다음에 30이 아니라 3이 나올 때에 그 충격이란....

어떻게 보면 거기에서 충격을 먹고 약간 멘탈이 흔들렸는지도 모르겠다.

 

한 마디로 이문제는 앞 뒤는 다 준비해놨는데 메인인 정렬 기준을 세우지 못해 쉽게 해결하지 못한 문제라고 할 수있다.

 

앞에서 말한 거 말고 다른 방법을 시도해본 거는 재귀함수를 사용하는 것이 있었다.

순열을 모두 찾아서 해당 케이스가 가장 큰 수인지 확인하는 방식이었는데 예제는 잘 통과하길래 혹시나 해서 제출했지만 역시나 시간초과였다.ㅎㅎ

그런데 이렇게 풀 때 문자열끼리의 부등호를 사용해봤는데 되더라 

검색을 해봤는데 파이썬이나 자바스크립트에서는 문자열 비교시 부등호를 사용하는 걸 알 수 있었는데 코틀린은 관련 자료가 없었다.

가능한 이유가 뭔지가 궁금하다...!

 

더이상 문제를 푸는데 진전이 없어지자 다른 사람들의 풀이를 참고하기 시작했다.

그리고 안 사실은 코틀린 메소드에 대한 정보가 얕아서 쉽게 풀지 못했다는 거였다.

sorted 함수는 알고 있었고 sortedBy, sortedWith 함수도 알고 있었다.

특히 sortedWith 함수는 여러 조건을 넣을 수 있다는 것도 알고 있었지만 파라미터로 Comparator 인터페이스를 오버라이딩해서 넣을 수 있다는 건 몰랐다.

또한 compareTo 함수는 생각도 안 났다.

이 문제에서 중요한 부분은 이웃하는 두 수를 붙였을 때의 대소비교였다

큰 순서대로 정렬하고 전체를 이어붙이면 답이 나오더라...

 

해당 방법으로 작성한 코드는 다음과 같다.

class Solution {
    fun solution(numbers: IntArray): String {
        if (numbers.none { it != 0 }) return "0"
        val stringNumbers = numbers.map { it.toString() }
        val sortedNumbers = stringNumbers.sortedWith { n1, n2 ->
            (n2 + n1).compareTo(n1 + n2)
        }

        return sortedNumbers.fold("") { acc, num -> acc + num }
    }
}

(0에 대한 예외처리를 하면서 none이라는 새로운 메소드를 알게 되었다.)

(배열 안에 조건에 맞는 값이 존재하지 않으면 true, 존재하면 false를 반환한다.)

 

지금까지 풀면서 처음으로 완전히 막힌 느낌이어서 답답했지만 뭐 아직 부족하니까 그런거고 잘 흡수하자는 생각을 했다.

억지로 안 보면서 풀다가 머리카락 빠지기만 하면 내가 손해니까 너무 많이 혼자서 붙잡고 있지말고 벽이다 싶으면 도움을 받아서 다음에는 넘을 수 있게 해야지...

반응형