본문 바로가기
알고리즘 문제풀이

[프로그래머스] 가장 큰 수 (Swift)

by SiO2whocode 2022. 4. 13.
728x90

https://programmers.co.kr/learn/courses/30/lessons/42746?language=swift 

 

코딩테스트 연습 - 가장 큰 수

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰

programmers.co.kr

정렬

정수 배열이 주어지면 이들을 적절히 순서를 변경하고 이어 붙여서 만들 수 있는 수 중에

가장 큰 수를 구하는 문제이다.

 

접근방법

처음에는 큰자리수의 숫자가 큰 것 순으로 정렬하려고 했는데 글자수길이가 상이할 경우 조건을 만족시키는 로직은 찾기 어려웠다.

찾아보니까 그렇게 풀면 출력초과가 난다고 해서..지움!

 

정렬 방법은 첫번째 문자와 두번째 문자 (Int->String으로 변환한 상태)를 순서를 바꿔서 이어붙인 수의 크기를 비교하는 것이다.

"6", "2" 문자열이 왔으면, "62" 와 "26"을 비교하여 큰 수가 나오는 순서로 정렬되게 하는 방법.

 

그런데 여기서 0으로만 구성된 배열이 올 경우 결과가 0000...일 수 있다.

정수형이 아니라 문자열을 반환하기 때문에 그대로 반환하면 안되고

첫번째 자리가 0이면 그 뒤에도 모두 0인 것이므로 "0"을 반환해 줘야 한다.

 

소스코드

import Foundation

func sortedBy(_ s1:String, _ s2:String) -> Bool {
    let s1s2:Int = Int(s1 + s2) ?? 0
    let s2s1:Int = Int(s2 + s1) ?? 0
    
    return s1s2 > s2s1
}

func solution(_ numbers:[Int]) -> String {
    
    let sortedNumbers = numbers.map{ String($0) }.sorted(by: sortedBy)
    
    let result:String = sortedNumbers.reduce("") { $0 + $1 }
    
    if result.first == "0" {
        return "0"
    } else { 
        return result
    }
}
728x90