Menu
Coddy logo textTech

sorted(by:)

Coddy Swift 여정의 로직 및 흐름 섹션에 포함된 레슨 — 56개 중 30번째.

숫자나 문자열과 같은 Comparable 값의 배열에서 .sorted()를 사용해 보셨을 것입니다. 다른 기준으로 정렬하고 싶을 때는, 두 개의 요소를 받아서 첫 번째 요소가 두 번째 요소보다 앞에 와야 할 때 true를 반환하는 클로저를 제공하세요.

let words = ["banana", "hi", "hello"]
let byLength = words.sorted { $0.count < $1.count }
print(byLength)              // ["hi", "hello", "banana"]

내림차순의 경우, 비교 연산자를 바꾸세요:

let down = words.sorted { $0.count > $1.count }
print(down)                  // ["banana", "hello", "hi"]

클로저는 파생된 값, 길이, 마지막 글자, 해시의 항목 등 무엇이든 비교할 수 있습니다. 클로저가 무엇을 비교하느냐에 따라 정렬 방식이 결정됩니다.

min(by:)max(by:)도 같은 방식으로 작동하지만, 정렬된 복사본 대신 단일 옵셔널 요소를 반환합니다.

challenge icon

챌린지

중급

한 줄의 입력을 읽습니다: 쉼표로 구분된 name:age 쌍의 목록입니다.

세 줄을 출력합니다:

  1. 나이순으로 오름차순 정렬된 이름들을 ,로 연결하여 출력합니다. 나이가 같을 경우 이름의 알파벳 순으로 정렬합니다.
  2. 가장 나이가 많은 사람의 이름 (max(by:)를 사용하세요). 동률일 경우, 먼저 나타나는 사람이 선택됩니다.
  3. 가장 나이가 적은 사람의 이름 (min(by:)를 사용하세요). 동률일 경우, 먼저 나타나는 사람이 선택됩니다.

입력이 alice:30,bob:22,cara:30,dan:18일 때, 출력은 다음과 같습니다:

dan,bob,alice,cara
alice
dan

치트 시트

파생된 값을 기준으로 정렬하려면 커스텀 클로저와 함께 .sorted { }를 사용하세요. 클로저는 두 개의 요소를 인자로 받으며, 첫 번째 요소가 두 번째 요소보다 앞에 와야 할 때 true를 반환합니다:

let words = ["banana", "hi", "hello"]
let byLength = words.sorted { $0.count < $1.count }
// ["hi", "hello", "banana"]

내림차순 정렬의 경우, 연산자를 바꿉니다:

let down = words.sorted { $0.count > $1.count }
// ["banana", "hello", "hi"]

min(by:)max(by:)는 동일한 클로저 시그니처를 사용하지만, 단일 옵셔널 요소를 반환합니다:

let longest = words.max(by: { $0.count < $1.count })  // "banana"
let shortest = words.min(by: { $0.count < $1.count }) // "hi"

직접 해보기

let people = readLine()!.components(separatedBy: ",").map { pair -> (String, Int) in
    let parts = pair.components(separatedBy: ":")
    return (parts[0], Int(parts[1])!)
}

// TODO: 나이 오름차순으로 정렬(동일 시 이름순); max(by:)로 최고령자 찾기; min(by:)로 최연소자 찾기
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

로직 및 흐름의 모든 레슨