본문 바로가기
알고리즘/프로그래머스

[프로그래머스] Lv.2 롤케이크 자르기

by 줍 2024. 4. 23.

1. 처음에는 0...i 그리고 i+1..<topping.count 를 각각 Set으로 만들어 요소의 갯수를 비교해주었는데, 모든 케이스가 시간초과되었다. 배열을 슬라이스하는 것은 많은 비용이 든다고 하니 되도록 쓰지 않아야겠다. 아래 풀이는 어떤 블로그를 참고했다. 동생은 끝에서부터 순회하도록 한 것이 새로웠다. stride 대신 Array(0..<topping.count).sorted(by: >) 이렇게 표현할 수도 있겠지만 stride의 활용을 상기시킬 수 있어서 좋았다.

func solution(_ topping:[Int]) -> Int {
    var older: [Int: Int] = [:]
    var olderSet: Set<Int> = []
    var younger: [Int: Int] = [:]
    var youngerSet: Set<Int> = []

    var answer = 0

    for i in 0..<topping.count {
        olderSet.insert(topping[i])
        older[i] = olderSet.count
    }

    for i in stride(from: topping.count - 1, to: -1, by: -1) {
        youngerSet.insert(topping[i])
        younger[i] = youngerSet.count
        if older[i - 1] == younger[i] { answer += 1 }
    }

    return answer
}