-
정렬_Programmers_가장 큰 수 [Swift]알고리즘/알고리즘 문제풀이 2025. 2. 17. 16:36
https://school.programmers.co.kr/learn/courses/30/lessons/42746?language=swift
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
풀어보려고 눌렀더니, 과거 기록이 있던 문제.
이번에도 자력으로 푸는데 실패했다.
접근 방법
- numbers의 숫자를 선택하는 순서는 무관하므로, 뒤에서부터 원소를 꺼낸다.
- queue가 빌때까지 반복한다.
- queue의 마지막 원소를 꺼내고 solArray의 insert하는 모든 경우를 만들어내어 posibles에 저장한다.
- posibles의 각 원소를 joined하여 ["1","3","2"] 형태를 "132"로 바꾼다. joined는 ["132","312","231"]의 형태가 된다.
- 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) '알고리즘 > 알고리즘 문제풀이' 카테고리의 다른 글
BinaryTree_Leetcode_108. Convert Sorted Array to Binary Search Tree [swift] (0) 2025.02.18 BinaryTree_Leetcode_Maximum Depth of Binary Tree [swift] (0) 2025.02.17 BinaryTree_LeetCode_Symmetric Tree [swift] (0) 2025.02.17 BinaryTree_Leetcode_Binary Tree Inorder Traversal [swift] (0) 2025.02.17 완전탐색_Programmgers_소수 찾기 [swift] (0) 2025.02.12