[Swift] [13일차] 가장 큰 수

·2024년 12월 20일
0

SwiftAlgorithm

목록 보기
16/105
post-thumbnail

나름 Sorting이라 관련 이미지..

Programmers - 가장 큰 수

import Foundation

func solution(_ numbers: [Int]) -> String {
    func mySorting(_ a: Int, _ b: Int) -> Bool {
        if String(a).count == String(b).count {
            return a > b
        }
        else {
            return String(a) > String(b)
        }
    }
    var k = numbers
    k.sort(by: mySorting)
    return k.map { String($0) }.joined()
}

결과

테스트 2
입력값 〉	[3, 30, 34, 5, 9]
기댓값 〉	"9534330"
실행 결과 〉	실행한 결괏값 "9534303"이 기댓값 "9534330"과 다릅니다.

이상한대로 나오는 결과값

나름 머리 써서 했었다. 둘이 길이가 같으면 숫자로 비교하고 , 그게 아닐 경우에는 String으로 아스키코드 값으로 판단해주면 나름 일관성있게 답이 나올지 알았는데

3 VS 30 에서 무너졌다.

이게 3이 더 작은값으로 나오더라 그렇다고 숫자가 두자리까지만 있는게 아니라서 일일히 조건 주기에는 너무 코드가 장황해지고 실효성도 떨어질 것 같았다.

그래서 처음에는 이게 길이가 다른데, 첫 숫자가 같으면! 길이가 짧은애를 주자!

햇지만, 34, 3 ,30 중에 이게 34보다도 3이 먼저오는 불상사가 생겨서 아예 생각을 달리하던중에
343 > 334, 330,303 이렇게 생각하다보니 그냥 합친채로 비교해주면 되겠구나! 싶어서
합친 상태로 비교해주는 로직으로 mySort함수를 변경해주었다.

import Foundation

func solution(_ numbers: [Int]) -> String {
    func mySorting(_ a: Int, _ b: Int) -> Bool {
        let ab = "\(a)\(b)"
        let ba = "\(b)\(a)"
        return ab > ba
    }

    var k = numbers
    k.sort(by: mySorting)
    return k.map { String($0) }.joined()
}

Q : ab랑 ba는 INT로 바꿔서 비교해줘야 되는거 아니에요 ?

라고 생각을 했었다. "3" 과 "19"를 비교했을 때는 3이 더 크게 나오기 때문인데, 좀 더 깊게 생각해보니까 서로 같은 친구를 뭉쳐서 비교를 하는 것이다보니까 이런 변수는 생각을 안해도 되는 것이었다. 319 VS 193 이면 319가 사전상으로도 더 크게 나온다.

해결..인줄 알았는데

11번 테트스케이스에 대해서 찾아보니 [0,0,0,0]이 주어졌을 때 0000으로 출력을 하니까 실패한다고 한다. 예외처리를 해주면 될 것이다.

import Foundation

func solution(_ numbers: [Int]) -> String {
    func mySorting(_ a: Int, _ b: Int) -> Bool {
        let ab = "\(a)\(b)"
        let ba = "\(b)\(a)"
        return ab > ba
    }

    var k = numbers
    k.sort(by: mySorting)
    return k[0] == 0 ? "0" : k.map { String($0) }.joined()
}

정답

타인의 코드

import Foundation

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

    let answer = sortedNumbers.map { String($0) }.reduce("") { $0 + $1 }
    return sortedNumbers.first == 0 ? "0" : answer
}
  1. 나는 joined를 사용했는데 reduce로 빈문자열서부터 다 더해준 방식이 신기했다.
  2. 나는 굳이 배열상태에서 [0]으로 했는데 .first쓴게 더 직관적인듯
  3. 이분은 Int()로 후에 탈없이 다 바꿔주신걸 확인할 수 있었는데, 나는 이럴 변수가 없다고 생각한 것 정도 차이가 있었다.
profile
기억보단 기록을

0개의 댓글