백준 2531번: 회전 초밥

https://www.acmicpc.net/problem/2531

난이도 - 실버1 🥈

알고리즘 분류: 투포인터

🧐 문제접근

윈도우 사이즈가 k로 정해져있어서, 윈도우를 먼저 만든다음, 한칸씩 이동하면서 최대값을 갱신하면됩니다

전체코드

//2531번 회전초밥
let t = readLine()!.split(separator: " ").map{Int(String($0))!}
let (n,d,k,c) = (t[0], t[1], t[2], t[3])

var arr = [Int]()

for _ in 0..<n {
    arr.append(Int(readLine()!)!)
}
arr.append(contentsOf: arr)

var start = 0, end = 0, result = 0
var eatDict = [c:1]

while end < k {
    if eatDict[arr[end]] == nil { eatDict[arr[end]] = 0 }
    eatDict[arr[end]]! += 1
    end += 1
}

while end < arr.count {
    result = max(result, eatDict.count)
    
    eatDict[arr[start]]! -= 1
    if eatDict[arr[start]] == 0 {
        eatDict[arr[start]] = nil
    }
    
    if eatDict[arr[end]] == nil {
        eatDict[arr[end]] = 0
    }
    eatDict[arr[end]]! += 1
    start += 1
    end += 1
}

print(result)

한줄평가: 무난무난

좋은 웹페이지 즐겨찾기