딕셔너리 정렬하기

알고리즘 문제에서 [:] 형으로 구성된 딕셔너리를 사용할 때, 값을 정렬하려면 sorted()메서드를 사용하면 된다.

직접 해당 컬렉션을 정렬하는 sort()와 달리 sorted()는 정렬된 값을 반환하므로 새로 값을 정의해줘야 한다.

let dictionary: [Int: Int] = [1: 100, 2: 200, 3: 300]
let sortedDictionary = dictionary.sorted()

그런데, 알다시피 딕셔너리는 배열과 달리 키:값 으로 이루어져있다. 그래서 그냥 sorted() 를 때려박으면 이런 오류가 뜬다.

type 'Dictionary<Int, Int>.Element' (aka '(key: Int, value: Int)') cannot conform to 'Comparable'

딕셔너리 타입의 값을 비교하는 것은 불가능하므로 sorted 메서드를 내 입맛에 맞게 설정 해 주면 된다.

key를 기준으로 정렬

key를 기준으로, key 값이 큰 수 대로 정렬하고 싶을 때는 다음과 같이 해 주면 된다.

let dictionary: [Int: Int] = [1: 100, 2: 200, 3: 300]
let sortedDictionary = dictionary.sorted { (first, second) in
                                          return first.key > second.key }
}

비교할 두 친구를 각각 first, second로 이름짓고, 각 key값의 대소관계를 반환한다.

축약하면 다음과 같이 쓸 수 있다.

let dictionary: [Int: Int] = [1: 100, 2: 200, 3: 300]
let sortedDictionary = dictionary.sorted { $0.0 > $1.0 }

$0$1은 각 딕셔너리 원소 하나를 의미하고, .0은 그 원소의 첫 번째 친구, 즉 키값을 의미한다.

value를 기준으로 정렬

value를 기준으로 하는 것은 key를 기준으로 하는 것과 동일하다.

let dictionary: [Int: Int] = [1: 100, 2: 200, 3: 300]
let sortedDictionary = dictionary.sorted { (first, second) in
                                          return first.value > second.value }

또는,

let dictionary: [Int: Int] = [1: 100, 2: 200, 3: 300]
let sortedDictionary = dictionary.sorted { $0.1 > $1.1 }

처럼 해 주면 된다.

value를 기준으로 정렬하되, 그 값이 같은 경우 key를 기준으로 정렬

그렇다면, 우선적으로 value를 기준으로 정렬하되, 그 값이 같은 경우 key를 기준으로 정렬하고자 한다면?

sorted 내부에 if/else 구문으로 친절히 써 주면 된다.

let dictionary: [Int: Int] = [1: 10, 2: 10, 3: 30, 4: 40]
let sortedDictionary = dictionary.sorted { (first, second) in
                                          if first.value == second.value {
                                              return first.key > second.key
                                          }
                                          return first.value < second.value }

또는,

let dictionary: [Int: Int] = [1: 10, 2: 10, 3: 30, 4: 40]
let sortedDictionary = dictionary.sorted {
                                          if $0.1 == $1.1 {
                                              return $0.0 > $1.0
                                          }
                                          return $0.1 < $1.1 }

로 손쉽게 써 주면 된다!

댓글남기기