https://programmers.co.kr/learn/courses/30/lessons/43164?language=swift
let tickets = [["ICN", "SFO"], ["ICN", "ATL"], ["SFO", "ATL"], ["ATL", "ICN"], ["ATL","SFO"]]
["ICN", "ATL", "ICN", "SFO", "ATL", "SFO"]
dfs로 풀었다. 방문한 위치와 사용한 티켓을 저장하기 위해 places와 indexes라는 배열에 넣어(스택) 값을 저장하였다. 각 티켓을 정확히 한번만 사용한다. 티켓 모두를 사용할 수 있는 방법들을 다 구한 후 그 중에서 오름차순인 것을 고른다.
*작성시 주의한 점
func solution(_ tickets: [[String]]) -> [String] {
var results: [[String]] = []
func dfs(_ places: [String] , _ indexes: [Int]) {
var dict: [Int: String] = [:] // index: place
if indexes.count >= tickets.count {
results.append(places)
return
}
for (index, ticket) in tickets.enumerated() {
if (ticket[0] == places.last) && !indexes.contains(index) {
dict[index] = ticket[1]
}
}
dict.forEach({
dfs(places + [$0.value], indexes + [$0.key])
})
}
dfs(["ICN"], [])
return results.sorted(by: sortByArrayElements)[0]
}
results의 각 배열의 요소들을 확인해 알파벳 오름차순으로 정렬하고 싶었다. 문제에서 모든 공항은 알파벳 대문자 3글자로 이루어진다고 했으므로, 배열 내부의 문자열들을 합친 이후에 알파벳순으로 정렬해주는 sortByArrayElements함수를 구현하였다.
let results = [["a", "c"], ["a", "b"]]
print(arr.sorted(by: sortByArrayElements)) // [["a", "b"], ["a", "c"]]
func sortByArrayElements(_ lhs: [String], _ rhs: [String]) -> Bool {
lhs.reduce("", +) < rhs.reduce("", +)
}