[AtCoder] AtCoder Beginner Contest 381 D. 1122 Substring

TaeGN·2024년 11월 24일

AtCoder

목록 보기
50/55

문제풀이

  1. A를 순회하며 1122 Substring을 만족하는 연속 부분 수열을 queue에 저장한다.
    • 각 숫자의 count가 0 or 2여야 한다.
    • 같은 숫자가 연속으로 2번 등장해야 한다.
  2. 4개의 경우로 나눠서 처리한다.
    • 같은 숫자가 연속으로 2번 등장한 경우 & 등장한 숫자의 count가 0이 아닌 경우
    • 같은 숫자가 연속으로 2번 등장한 경우 & 등장한 숫자의 count가 0인 경우
    • 같은 숫자가 연속으로 2번 등장하지 않은 경우 & 등장한 숫자가 이전 숫자와 같은 경우
    • 같은 숫자가 연속으로 2번 등장하지 않은 경우 & 등장한 숫자가 이전 숫자와 다른 경우

주의사항


소요시간

20분


package AtCoder.ABC.ABC381.D

fun main() {
    val N = readln().trim().toInt()
    val A = readln().trim().split(" ").map(String::toInt)
    val count = IntArray(200001)
    val queue = ArrayDeque<Int>()
    var result = 0
    var i = 0
    while (i < N) {
        if (i < (N - 1) && A[i] == A[i + 1]) {
            if (count[A[i]] != 0) {
                while (count[A[i]] != 0) count[queue.removeFirst()]--
            }
            repeat(2) {
                count[A[i]]++
                queue.add(A[i++])
            }
        } else if (queue.isNotEmpty() && queue.last() == A[i]) {
            while (queue.size > 1) count[queue.removeFirst()]--
            count[A[i]]++
            queue.add(A[i++])
        } else {
            while (queue.isNotEmpty()) count[queue.removeFirst()]--
            i++
        }
        if (queue.size % 2 == 0) result = maxOf(result, queue.size)
    }
    println(result)
}

문제링크

https://atcoder.jp/contests/abc381/tasks/abc381_d

0개의 댓글