[내일배움캠프 7주차 (02/10)]

yeseul jang·2026년 2월 10일

내일배움캠프

목록 보기
10/32
post-thumbnail

♾️ 코딩테스트 - 가장 큰 수

Lv 2. 가장 큰 수

func solution(_ numbers:[Int]) -> String {
    if numbers.allSatisfy { $0 == 0 } {
        return "0"
    }
    var stringNum = numbers.map { (String($0)) }
    let a = stringNum.sorted { String(repeating: $0, count: 3) > String(repeating: $1, count: 3) }
    return a.joined()
}
  • 같은 숫자길이끼리 정렬하면 내가 의도한대로 정렬이 되었는데, 30, 3 이런 같은 숫자가 맨 앞에 올 경우 30이 문자열 자체가 길다보니 더 큰 값으로 왔다.
  • 다행이 문제를 보니 각 숫자의 크기는 1000 이하였다. 한자리 숫자와 비교해야 할 가장 긴 숫자는 세자릿수이기 때문에 3번 반복해주어서 정렬하도록 만들었다.

📚 sorted 정렬기준으로 비교하기

📘 기본 형태

array.sorted { a, b in
    key(a) < key(b) // 이건 bool값
}

📘 기본 예시 (간단한 정렬기준)

let arr = ["apple", "kiwi", "banana"]

let result = arr.sorted {
    $0.count < $1.count
}

📘 가공한 값으로 정렬

  • 모든 요소에 특정 작업해서 비교
let arr = ["990", "99", "9"]

let result = arr.sorted {
    String(repeating: $0, count: 3) < String(repeating: $1, count: 3)
}

📘 여러 조건일 때 (if문)

  • 특정 경우만 다른 조건으로 비교할 수 있음
let result = arr.sorted {
    if $0.count == $1.count { // 길이가 같은 경우만 
        return Int($0)! < Int($1)! // 숫자로 바꾸어 비교 
    }
    return $0.count < $1.count // 길이자체만 비교
}

📘 여러 조건일 때 (튜플 사용)

let result = arr.sorted {
    ($0.count, $0) < ($1.count, $1)
}
  • 튜플에 넣으면 자동으로 순서대로 비교해줌
  • 일단 길이 비교하고 같은 경우 그 다음 값 비교함

📘 시간 고려하기 - Schwartzian Transform

  • 정렬할때 매번 계산하지 말고 정렬 기준을 정해서 미리 묶어두는 방식
let result = arr
    .map { ($0, String(repeating: $0, count: 3)) } // 튜플로 기준값이랑 묶어주기 
    .sorted { $0.1 < $1.1 } // 기준값 기준으로 정렬하기
    .map { $0.0 } // 다시 원본 만들기

📘 비교 결과

  • 실제로 시간이 줄어든 것을 확인함
이전 코드이후 코드
profile
iOS 개발

0개의 댓글