주간 비교하기
Coddy Swift 여정의 로직 및 흐름 섹션에 포함된 레슨 — 56개 중 37번째.
최종 기능: 2주간의 데이터를 가져와 습관별 변화를 보고합니다.
각 주는 별도의 줄에 habit:day 작업 목록으로 구성됩니다. 지금까지 했던 것과 동일한 방식으로 두 개의 딕셔너리를 만든 다음, 서로 비교하세요.
흥미로운 습관 세트는 두 주에 걸친 키의 합집합입니다 (어떤 습관은 한 주에는 나타나고 다른 주에는 나타나지 않을 수 있습니다). 알파벳순으로 정렬된 해당 합집합을 반복합니다.
let allKeys = Set(weekA.keys).union(weekB.keys).sorted()
for name in allKeys {
let a = weekA[name]?.count ?? 0
let b = weekB[name]?.count ?? 0
print("\(name): \(a) -> \(b)")
}?? 0은 키가 없는 경우를 처리합니다. weekA[name]?.count는 먼저 언래핑(unwrapping)하지 않고 개수를 읽는 옵셔널 체이닝(optional-chained) 방식이며, 키가 없을 때 nil을 반환하고, ?? 0은 이를 0으로 변환합니다.
챌린지
중급두 줄의 입력을 읽습니다. 각 줄은 쉼표로 구분된 habit:day 항목의 리스트(주당 하나씩)입니다. 두 주 중 어느 한 곳이라도 나타나는 모든 습관에 대해, 다음 형식으로 한 줄씩 출력하세요:
<habit>: <a> -> <b> <arrow>여기서 a는 1주 차의 고유한 날짜 수, b는 2주 차의 고유한 날짜 수이며, arrow는 다음과 같습니다:
b > a일 때UPb < a일 때DOWNb == a일 때SAME
습관은 알파벳 순서로 출력하세요. 습관별 출력 줄 다음에, 하나의 요약 줄을 출력하세요:
Improved: <n>여기서 n은 arrow가 UP인 습관의 개수입니다.
첫 번째 줄에 read:1,read:3,workout:2가 입력되고 두 번째 줄에 read:1,read:2,read:5,yoga:7이 입력될 경우, 출력은 다음과 같습니다:
read: 2 -> 3 UP
workout: 1 -> 0 DOWN
yoga: 0 -> 1 UP
Improved: 2치트 시트
두 딕셔너리로부터 키의 합집합을 얻고 알파벳 순으로 반복하려면:
let allKeys = Set(weekA.keys).union(weekB.keys).sorted()
for name in allKeys {
let a = weekA[name]?.count ?? 0
let b = weekB[name]?.count ?? 0
print("\(name): \(a) -> \(b)")
}weekA[name]?.count는 언래핑(unwrapping) 없이 개수를 가져오기 위해 옵셔널 체이닝(optional chaining)을 사용하며, 키가 없으면 nil을 반환합니다. ?? 0은 해당 nil을 0으로 변환합니다.
직접 해보기
func parse(_ line: String) -> [String: [Int]] {
var habits: [String: [Int]] = [:]
if line.isEmpty { return habits }
for op in line.components(separatedBy: ",") {
let parts = op.components(separatedBy: ":")
let day = Int(parts[1])!
if !(habits[parts[0], default: []].contains(day)) {
habits[parts[0], default: []].append(day)
}
}
return habits
}
let weekA = parse(readLine()!)
let weekB = parse(readLine()!)
// TODO: 키의 합집합; 습관별 '<name>: a -> b ARROW'; 그 다음 'Improved: <n>'
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.