최장 연속 기록
Coddy Swift 여정의 로직 및 흐름 섹션에 포함된 레슨 — 56개 중 35번째.
스트릭(streak)은 습관을 완료했다고 표시한 연속된 일수를 의미합니다. [1, 2, 3, 5, 6]일의 경우, 가장 긴 스트릭은 3(1-3일)입니다.
정렬된 날짜 리스트가 있으면 이를 계산하는 것은 간단한 선형 탐색(linear scan)입니다. 각 날짜를 이전 날짜와 비교하여 연속적이면 현재의 연속 기록을 연장하고, 그렇지 않으면 초기화하면 됩니다.
func longestStreak(_ days: [Int]) -> Int {
let sorted = days.sorted()
var best = 0
var run = 0
var prev: Int? = nil
for d in sorted {
if let p = prev, d == p + 1 {
run += 1
} else {
run = 1
}
if run > best { best = run }
prev = d
}
return best
}"현재 진행 상황 추적 + 지금까지의 최적값"이라는 패턴은 많은 문제에서 반복됩니다. 한 번 익혀두면 평생 당신의 것이 됩니다.
챌린지
중급한 줄의 입력을 읽습니다: 쉼표로 구분된 habit:day 항목 목록입니다. 이전 레슨에서 했던 것과 동일한 딕셔너리를 생성한 다음, 각 습관에 대해 일주일 동안의 가장 긴 연속 일수 스트릭(streak)을 계산하세요.
습관을 알파벳 순서대로 한 줄에 하나씩 다음 형식으로 출력하세요:
<habit>: streak=<n>입력이 read:1,read:2,read:3,read:5,workout:2,workout:4인 경우, 출력은 다음과 같습니다:
read: streak=3
workout: streak=1직접 해보기
var habits: [String: [Int]] = [:]
let ops = readLine()!.components(separatedBy: ",")
for op in ops {
let parts = op.components(separatedBy: ":")
let day = Int(parts[1])!
if !(habits[parts[0], default: []].contains(day)) {
habits[parts[0], default: []].append(day)
}
}
// TODO: 습관별 최장 연속 기록을 계산하고, 이름순으로 정렬하여 'name: streak=n' 형식으로 출력하세요.
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.