https://www.acmicpc.net/problem/2531
[풀이]
투 포인터를 통해 해결하였다.
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 |