개발/Swift

[Swift] 가장 큰 수 코딩테스트 프로그래머스

덤벨로퍼 2022. 1. 17. 18:16

배열을 결국 잘 정렬 하면 되는 문제다.

결국 가장 큰수를 만들기 위해서는 정렬 할때

두숫자의 조합을 비교해 더큰수를 기준으로 정렬하면 되는것이다.

예를 들어 30, 34 를 비교할떄

3034 vs 3430

이렇게 두수를 합쳐서 비교하면 정렬이 완성된다.

 

단지 “0000” 인경우를 예외로 두면 된다.

func solution(_ numbers:[Int]) -> String {
    
    var sortedNumbers = numbers.sorted { (num1, num2) -> Bool in
        return Int("\\(num1)\\(num2)")! > Int("\\(num2)\\(num1)")!
    }

    if(sortedNumbers[0]==0){
        return "0"
    }
    let result =  sortedNumbers.reduce("") { (res, num) -> String in
        return "\\(res)\\(num)"
    }
    return result
    
}

 

 

 

실패한 문제해결법

 

 

문제 해결을 위해서 배열을 정렬을 해야하는데 정렬 하기위한 룰을

이렇게 설정하면 가장 큰수가 나올것이다.

  1. 수의크기(길이) 를 무시하고 첫번째 자리 수가 큰 순으로 정렬한다.
    1. ex> 7 > 59
  2. 첫자리수가 같을때는 이순서대로 정렬한다.
    1. 두번째 자리수를 비교하여 큰값을 앞으로 정렬
    2. 비교할 수중 두번쟤 자리수가 없으면 앞자리 사용 ( 3 vs 34 → 33 vs 34)
    3. 1000까지 이므로 결과가 계속 안나면 세번쟤 자리까지 반복
    4. 세번쨰까지 같으면 냅둠
func solution(_ numbers:[Int]) -> String {
    
    var sortedNumbers = numbers.sorted { (num1, num2) -> Bool in
        var arr1 = makeArray(num: num1)
        var arr2 = makeArray(num: num2)
        
        if(arr1[0] == arr2[0]){
            if(arr1.count<2){
                arr1.append(arr1[0])
            }
            if(arr2.count<2){
                arr2.append(arr2[0])
            }
            if(arr1[1]==arr2[1]){
                if(arr1.count<3){
                    arr1.append(arr1[1])
                }
                if(arr2.count<3){
                    arr2.append(arr2[1])
                }
                if(arr1[2]==arr2[2]){
                    return false
                }else{
                    return arr1[2]>arr2[2]
                }
            }else{
                return arr1[1]>arr2[1]
            }
        }else{
            return arr1[0] > arr2[0]
        }
    }
    
    var result = ""
    for i in 0..<sortedNumbers.count {
        result += "\\(sortedNumbers[i])"
    }

    return result
    
}

func makeArray(num:Int) -> [Int]{
    let str = "\\(num)"
    return str.compactMap{$0.wholeNumberValue}
}