개발/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
}
실패한 문제해결법
문제 해결을 위해서 배열을 정렬을 해야하는데 정렬 하기위한 룰을
이렇게 설정하면 가장 큰수가 나올것이다.
- 수의크기(길이) 를 무시하고 첫번째 자리 수가 큰 순으로 정렬한다.
- ex> 7 > 59
- 첫자리수가 같을때는 이순서대로 정렬한다.
- 두번째 자리수를 비교하여 큰값을 앞으로 정렬
- 비교할 수중 두번쟤 자리수가 없으면 앞자리 사용 ( 3 vs 34 → 33 vs 34)
- 1000까지 이므로 결과가 계속 안나면 세번쟤 자리까지 반복
- 세번쨰까지 같으면 냅둠
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}
}