최장 연속 기록
Coddy Swift 여정의 로직 및 흐름 섹션에 포함된 레슨. 56개 중 35번째.
streak은 habit이 완료로 표시된 연속된 days의 실행입니다. days가 [1, 2, 3, 5, 6]인 경우, 가장 긴 streak은 3입니다(1~3일).
정렬된 sorted day 목록이 있으면 이를 계산하는 것은 간단한 선형 스캔입니다. 각 day를 이전 항목과 비교하고, 연속된 경우 현재 run을 계속 확장하며, 그렇지 않으면 재설정합니다.
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
}"현재 run + 지금까지의 best" 패턴은 많은 문제에서 반복해서 등장합니다. 한 번 알아두면 평생 여러분의 것이 됩니다.
챌린지
중급입력 한 줄을 읽습니다. 쉼표로 구분된 habit:day 항목 목록입니다. 이전 레슨에서 했던 것과 동일한 딕셔너리를 만든 다음, 각 habit에 대해 일주일 동안 가장 긴 연속 일수 streak을 계산합니다.
habit을 알파벳순으로 한 줄에 하나씩 다음 형식으로 출력합니다.
<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'으로 출력
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
로직 및 흐름의 모든 레슨
직접 연습해 보세요: Swift 플레이그라운드