https://school.programmers.co.kr/learn/courses/30/lessons/42746
주어진 배열에 있는 정수를 이어붙여 만들 수 있는 가장 큰 수를 찾으면 된다.
필자는 모든 경우의 수 즉, 주어진 배열에 있는 정수를 이어붙여서 만들 수 있는 모든 수를 찾아서 그 중에서 가장 큰 수를 리턴하고자 했다. 그러기 위해서 순열을 이용하였지만 시간 초과
가 발생하여 다른 접근 방식을 생각해야 했다.
import Foundation
func permute(_ nums: [String], _ targetNum: Int) -> [[String]] {
var result = [[String]]()
var visited = [Bool](repeating: false, count: nums.count)
func permutation(_ nowPermute: [String]) {
if nowPermute.count == targetNum {
result.append(nowPermute)
return
}
for i in 0..<nums.count {
if visited[i] == true {
continue
}
else {
visited[i] = true
permutation(nowPermute + [nums[i]])
visited[i] = false
}
}
}
permutation([])
return result
}
extension String {
subscript(_ index: Int) -> Character {
return self[self.index(self.startIndex, offsetBy: index)]
}
}
func solution(_ numbers:[Int]) -> String {
var nums: [String] = numbers.map { String(Int($0)) }
var per = permute(nums,numbers.count)
var arr: [String] = []
for i in per {
var str: String = i.reduce("",+)
if arr.max() ?? "0" < str {
arr.append(str)
}
}
return arr.max()!
}
모든 경우를 따지지 말고 가장 큰 수를 만들기 위해 주어진 배열을 이어붙여 만들었을 때 내림차순으로 정렬되게 하였다.
주의할 점은 이렇게 정렬하고나서 배열의 첫번째 원소가 0이라면 배열이 [0, 0, 0, 0, ...] 라는 의미이므로 예외 처리해야한다는 것이다.
import Foundation
func solution(_ numbers:[Int]) -> String {
let nums: [Int] = numbers.sorted { Int("\($0)\($1)")! > Int("\($1)\($0)")! }
if nums.first == 0 {
return "0"
}
let answer: String = nums.reduce("") { "\($0)" + "\($1)" }
return answer
}