👨🏻‍💻iOS 공부/Swift_알고리즘 풀이

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

728x90
반응형

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

 

코딩테스트 연습 - 가장 큰 수

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰

programmers.co.kr

 

주어진 수를 조합하여 가장 큰 수를 만들어 내는 것이 목표이다. 

 

정렬을 우선적으로 해야하는 것은 알았는데 비교를 하며 정렬하는 방법을 구현해내지 못했었다. 

그래서 한참을 고민하다가 여러 블로그, 답안들을 보고 깨우쳤다...!

 

처음에는 두 자리 이상의 수를 한 자리까지 내려서 비교하고 정렬하려고 했는데, 그렇게 하면 timeout이 될 것 같았다. 

그래서 아래의 방법으로 비교하며 정렬해주는 방식으로 풀게되었다. 

var nums = numbers.sorted { Int("\($0)\($1)")! > Int("\($1)\($0)")!}

 

[ "8", "4" ] 가 주어졌다면, 48과 84를 비교할 수 있도록 해주는 것이다..! 

\()안에 넣어서 문자열로 합치고, 그 이후 정수형으로 비교해주는 방식인 것이다. (왜 생각해내지 못했을까...)

 

아무튼 이렇게 정렬을 하고 예외처리를 해줘야 하는데, 배열의 가장 큰 값이 0인 경우이다. 

이 경우 그냥 바로 "0"을 리턴해주면 된다. 문자열로 다루다보니 "000" 처럼 나오는 경우가 있는데 수를 이렇게 표기하진 않기 때문에 처리해준다! 

 

import Foundation

func solution(_ numbers:[Int]) -> String {
    
    let num = numbers.sorted { Int("\($0)\($1)")! > Int("\($1)\($0)")! }
    if num[0] == 0 {
        return "0"
    }
    return num.map {String($0)}.joined()
}

 

코드는 간략하지만, 아이디어가 필요한 문제였던 것 같다.

 

숫자여도 문자로 활용해보는 방식도 충분히 고려해볼 필요가 있을 것 같다. 

sorted { $0 > $1 }

매번 이렇게만 써왔었는데, 이 처럼 상황에 맞게 쓸 수 있도록 혜안을 기르는 것이 중요한 것 같다..!

 

 

ref. https://caution-dev.tistory.com/4

728x90
반응형