Menu
Coddy logo textTech

최장 연속 기록

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" 패턴은 많은 문제에서 반복해서 등장합니다. 한 번 알아두면 평생 여러분의 것이 됩니다.

challenge icon

챌린지

중급

입력 한 줄을 읽습니다. 쉼표로 구분된 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'으로 출력
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

로직 및 흐름의 모든 레슨

직접 연습해 보세요: Swift 플레이그라운드