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

 
▼ 문제 링크

 

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

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

programmers.co.kr

 

# 풀이 1
내장 정렬 함수를 사용하지 않는 방법 시도
import Foundation

func solution(_ numbers:[Int]) -> String {
    var nums = [[String]]()
    var result = ""
    
    // [Int] -> [String]
    for number in numbers {
        nums.append(String(number).map{String($0)})
    }
    
    while !nums.isEmpty {
        var first = 0 // 가장 큰 첫번째 숫자
        var largest = [[String]]()
        
        // 가장 큰 첫번째 숫자 구하기
        for num in nums {
            first = (Int(num[0])! > first ? Int(num[0])! : first)
        }
        
        // 첫번째 숫자가 같은 수가 여러개일 때
        for (index, num) in nums.enumerated() {
            if Int(num[0])! == first {
                largest.append(num)
                nums[index] = ["-1"]
            }
        }
        nums = nums.filter { $0 != ["-1"] }
        
        // 해당 첫번째 숫자를 가진 수가 하나일 때
        if largest.count == 1 {
            for value in largest[0] {
                result += value
            }
            continue
        }
        
        // 첫번째 수가 같은 숫자들 순서 정하는 로직 구현 필요
    }
    
    return result
}

처음엔 sort(), sorted()같은 정렬 함수를 쓰지 않고 구현해야 하는 줄 알아서 구구절절 코드가 길어졌다.

[92, 55, 10] 처럼 첫번째 수가 전부 다 다른 경우에는 해당 로직으로 답을 구할 수 있지만, [30, 32, 3, 58, 67]처럼 앞자리가 3인 수가 여러개일 경우 비교하는 로직을 구현하지 못했다.🥲

꽤 오랜 시간 붙들고 있었지만, 결국 해결하지 못하고 집단 지성의 힘을 빌림

 

 

# 풀이 2
내장 함수 사용 및 숫자를 표현한 String의 특성
import Foundation

func solution(_ numbers:[Int]) -> String {
    // Int -> String으로 변환
    var nums = numbers.map { String($0) }
    
    // 두 숫자를 합쳐서 더 큰 숫자가 되는 걸 앞에 배치
    nums.sort { $0+$1 > $1+$0 }
    
    // [0, 0, 0]경우 "000"으로 표기되므로 "0"으로 반환
    if nums[0] == "0" {
        return "0"
    }
    
    // 배열을 풀어서 하나의 String으로 반환
    return nums.joined()
}

해답은 생각보다 훠어얼씬 짧고 간단했다.

내장 정렬 함수를 쓰되, 단순 크기 비교가 아니라 합쳤을 때 더 큰 수를 어떻게 구하는지 궁금했는데 nums.sort { $0+$1 > $1+$0 } 이런 방법이 있었다. 

다른 언어에서는 어떨지 모르겠는데, Swift에서는 숫자를 문자로 표현했을 때 문자를 숫자처럼 비교할 수 있다.

var num1: String = "12"
var num2: String = "64"

// "num1 is smaller than num2"
print((num1 > num2 ? "num1 is bigger than num2" : "num1 is smaller than num2"))

이런식으로 num1과 num2가 String 타입이어도 숫자처럼 비교할 수 있다.

 

sort()를 단순히 오름차순, 내림차순으로 정렬할 때만 사용했는데, 이런식으로도 활용이 가능하다는 걸 배웠다.
아직 갈 길이 멀구나