본문 바로가기
Algorithm/문제풀이_프로그래머스

[Swift][프로그래머스][정렬] 가장 큰 수

by Joahnee 2022. 4. 13.

요구능력

정렬과 문자열에 대한 이해

 

문제풀이

Swift의 경우 sort()함수를 제공한다.

sort()함수는 Timsort라는 정렬 알고리즘으로 이루어져있는데,

Timsort는 insertionSort와 mergeSort가 합쳐진것이라고 한다.

swift에서 알고리즘문제를 풀면서 거의 유일(?)하게 빠르고 좋은함수인것같다.

최악의 경우에도 O(nlogn)의 성능을 뽑아낸다.

 

이 문제는 이미 문제에 풀이법을 적어놨다.

문자열로 처리해서 리턴해라...

그렇다. 정렬할때도 문자열로 처리해서 더 큰 경우의 수를 맨앞에 놓는 내림차순을 하면 되는것이었다.

쉽게 설명하자면

[6, 10, 2]가 있으면

"\(6)" + "\(10)" 과 "\(10)" + "\(6)" 중 크게나오는 경우로 내림차순을 하라는 말이다.

그럼 "610"과 "106"중 크게 나오는 것은 "610"이다.

따라서 6이 앞에가고 10이 뒤로가게 정렬된다.

 

그리고 테스트케이스 11번에서 틀렸는데, 문제를 보면 numbers의 원소는 0부터 시작한다.

근데 우리가 문자열을 쓰는 이유가 정답이 클 수도 있기 때문에 문자열로 리턴하라는 것이다.

정렬을 하기 때문에 0010 과 같은 경우는 안나오겠지만,

00이나 000이나 0000과 같은 경우가 나올 수 있다.

 

그래서 check변수로 처음에 0이나오고 뒤로 또 0이나오거나 하는걸 막기위해서

정렬한값이 0이면 check는 계속해서 false일 것이고 result = "0"이 된다.

그러다가 0이 아닌값이 들어오게되고 check가 false인 상태이면 check를 true로 바꿔주고 result를 빈 문자열로 바꿔준다.

check가 false인 상태까지 보는이유는 처음부터 연속적으로 0이나오는 것이 아닌 중간에 들어가는 0은 그대로 넣어줘야하기 때문이다.

 

후기

이해하고 나면 쉬운문제이지만, 왜 생각못했지 싶기도한 문제이다.

코드

func solution(_ numbers:[Int]) -> String {
    var check = false
    var result = ""
    var tempNumbers = numbers
    tempNumbers.sort{
        "\($0)" + "\($1)" > "\($1)" + "\($0)"
    }
    for i in tempNumbers{
        if i != 0 && !check {
            check = true
            result = ""
        }
        if check{
            result += "\(i)"
        }else{
            result = "0"
        }
    }
    return result
}

댓글