[프로그래머스] 가장 큰 수

silverCastle·2022년 8월 5일
0

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
}

0개의 댓글