ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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}
    }
    
    반응형

    댓글

Designed by Tistory.