백준 [2531] kotlin

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

 

2531번: 회전 초밥

첫 번째 줄에는 회전 초밥 벨트에 놓인 접시의 수 N, 초밥의 가짓수 d, 연속해서 먹는 접시의 수 k, 쿠폰 번호 c가 각각 하나의 빈 칸을 사이에 두고 주어진다. 단, 2 ≤ N ≤ 30,000, 2 ≤ d ≤ 3,000, 2 ≤

www.acmicpc.net

[풀이]

투 포인터를 통해 해결하였다.

nList 라는 배열을 만들어, 연속 해서 먹는 접시 수 k 만큼 저장을 해둔다.

또한 hashSet을 이용하여, 초밥 가지 수를 구할 수 있다.

이렇게 구한 초밥 가지 수를 최대 값과 비교해 가며 갱신을 한다

이때 만약 고른 초밥에 쿠폰 초밥이 있으면, 길이를 그냥 비교를 하고 만약 쿠폰 초밥이 없다면 길이에 +1하여 비교를 해준다.

 

[코드]

import kotlin.math.max

fun main()
{
    var tmp = readLine()!!.split(" ").map{it.toInt()}
    var N = tmp[0]
    var d = tmp[1]
    var k = tmp[2]
    var c = tmp[3]
    var sushi = ArrayList<Int>()
    repeat(N)
    {
        sushi.add(readln().toInt())
    }

    var nList = ArrayList<Int>()

    repeat(k)
    {
        i ->
        nList.add(sushi[i])
    }
    var nSet = HashSet(nList)
    var i = 0
    var j = k-1
    var ans = 0

    while (i<N)
    {
        if(nSet.contains(c)) ans = max(ans, nSet.size)
        else ans = max(ans, nSet.size+1)
        nList.add(sushi[(++j)%N])
        nList.remove(sushi[i++])
        nSet = HashSet(nList)
        j %= N
    }
    println(ans)
}

'백준 > 투 포인터' 카테고리의 다른 글

백준 [2467] kotlin  (0) 2023.01.12
백준 [2493] kotlin  (0) 2023.01.11
백준 [20437] kotlin  (0) 2023.01.10
백준 [1806] kotlin  (0) 2023.01.08
백준 [1253] kotlin  (0) 2023.01.07