알고리즘/알고리즘 문제풀이

정렬_Programmers_가장 큰 수 [Swift]

Downey 2025. 2. 17. 16:36

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

풀어보려고 눌렀더니, 과거 기록이 있던 문제.

이번에도 자력으로 푸는데 실패했다.

 

접근 방법

  1. numbers의 숫자를 선택하는 순서는 무관하므로, 뒤에서부터 원소를 꺼낸다.
  2. queue가 빌때까지 반복한다.
  3. queue의 마지막 원소를 꺼내고 solArray의 insert하는 모든 경우를 만들어내어 posibles에 저장한다.
  4. posibles의 각 원소를 joined하여 ["1","3","2"] 형태를 "132"로 바꾼다. joined는 ["132","312","231"]의 형태가 된다.
  5. index별 숫자를 비교하여 정렬한다

오답 코드

더보기
func solution(_ numbers:[Int]) -> String {
    var reversedQueue = numbers.map { "\($0)" }
    var solArray = [reversedQueue.removeLast()]
    
    while !reversedQueue.isEmpty {
        let target = reversedQueue.removeLast()
        var posibles = [[String]]()
        for i in 0...solArray.count {
            var temp = solArray
            temp.insert(target, at: i)
            posibles.append(temp)
        }
        // print(posibles.map { $0.joined()})
        let joined = posibles.map { $0.joined()}
        var max = joined.sorted(by: { lhs, rhs in
            // Int($0)! < Int($1)! overflow난다
            // 각 자릿수를 비교한다.
            var isLeftSmall = true
            for index in lhs.indices {
                if lhs[index].wholeNumberValue! == rhs[index].wholeNumberValue! { continue }
                else {
                    isLeftSmall = lhs[index].wholeNumberValue! < rhs[index].wholeNumberValue!
                    break
                }
            }
            return isLeftSmall
        }).last!
        let maxIndex = joined.firstIndex(of: max)!
        solArray = posibles[maxIndex]
    }
    
    return solArray.joined()
    
}

오답 코드 성능

더보기
테스트 1 실패 (시간 초과)
테스트 2 실패 (시간 초과)
테스트 3 실패 (시간 초과)
테스트 4 실패 (시간 초과)
테스트 5 실패 (시간 초과)
테스트 6 실패 (시간 초과)
테스트 7 통과 (1.90ms, 16.7MB)
테스트 8 통과 (0.75ms, 16.8MB)
테스트 9 통과 (1.56ms, 16.6MB)
테스트 10 통과 (0.71ms, 16.7MB)
테스트 11 실패 (102.57ms, 16.8MB)
테스트 12 통과 (0.18ms, 17MB)
테스트 13 통과 (0.22ms, 16.9MB)
테스트 14 통과 (0.29ms, 16.6MB)
테스트 15 통과 (0.20ms, 16.8MB)

정답 코드

더보기


func solution(_ numbers:[Int]) -> String {
    var nb = numbers.map { "\($0)" }
    let sorted = nb.sorted(by: { 
        // Int($1+$0) < Int($0+$1)
        $1 + $0 < $0 + $1
    })
    
    return sorted.first == "0" ? "0" : sorted.joined()
}

정답 코드 풀이

예제: [3, 30, 34, 5, 9]

 

1️⃣ “3”과 “30” 비교

 

우리는 "3" + "30" = "330"  "30" + "3" = "303" 을 비교한다.

“330” > “303” 이므로 "3" "30"보다 앞에 와야 한다.

 

2️⃣ “34”와 “3” 비교

 

우리는 "34" + "3" = "343"  "3" + "34" = "334" 을 비교한다.

“343” > “334” 이므로 "34" "3"보다 앞에 와야 한다.

 

3️⃣ “5”와 “34” 비교

 

우리는 "5" + "34" = "534"  "34" + "5" = "345" 을 비교한다.

“534” > “345” 이므로 "5" "34"보다 앞에 와야 한다.

 

4️⃣ “9”와 “5” 비교

 

우리는 "9" + "5" = "95"  "5" + "9" = "59" 을 비교한다.

“95” > “59” 이므로 "9" "5"보다 앞에 와야 한다.

 

숫자 정렬이 아니라 문자비교를 하는 이유

1. overflow 방지

2. 사전순 정렬을 위하여. 

 

정답 코드 성능

더보기
테스트 1 통과 (270.35ms, 21.5MB)
테스트 2 통과 (154.74ms, 18.8MB)
테스트 3 통과 (459.70ms, 22.6MB)
테스트 4 통과 (5.68ms, 16.3MB)
테스트 5 통과 (357.98ms, 20.7MB)
테스트 6 통과 (271.04ms, 20.2MB)
테스트 7 통과 (0.15ms, 16.1MB)
테스트 8 통과 (0.21ms, 16.3MB)
테스트 9 통과 (0.12ms, 16.3MB)
테스트 10 통과 (0.13ms, 16.3MB)
테스트 11 통과 (0.11ms, 16.4MB)
테스트 12 통과 (0.15ms, 16.2MB)
테스트 13 통과 (0.12ms, 16.6MB)
테스트 14 통과 (0.21ms, 16.4MB)
테스트 15 통과 (0.15ms, 16.5MB)