Menu
Coddy logo textTech

최장 연속 기록

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
}

"현재 진행 상황 추적 + 지금까지의 최적값"이라는 패턴은 많은 문제에서 반복됩니다. 한 번 익혀두면 평생 당신의 것이 됩니다.

challenge icon

챌린지

중급

한 줄의 입력을 읽습니다: 쉼표로 구분된 habit:day 항목 목록입니다. 이전 레슨에서 했던 것과 동일한 딕셔너리를 생성한 다음, 각 습관에 대해 일주일 동안의 가장 긴 연속 일수 스트릭(streak)을 계산하세요.

습관을 알파벳 순서대로 한 줄에 하나씩 다음 형식으로 출력하세요:

<habit>: streak=<n>

입력이 read:1,read:2,read:3,read:5,workout:2,workout:4인 경우, 출력은 다음과 같습니다:

read: streak=3
workout: streak=1

치트 시트

최장 연속 기록 – 현재 연속 횟수와 지금까지의 최고 기록을 추적하는 선형 탐색:

func longestStreak(_ days: [Int]) -> Int {
    let sorted = days.sorted()
    var best = 0, 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
}

각 날짜가 이전 날짜에 1을 더한 값과 같을 때 날짜가 연속된 것으로 간주합니다. 간격이 발생하면 run1로 재설정하고, 매 반복마다 best를 업데이트합니다.

직접 해보기

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실력 점검

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

로직 및 흐름의 모든 레슨