코딩테스트 준비/백준

[백준 20922] - 곂치는 건 싫어 c++

SeoburiFaust 2024. 2. 13. 16:18

 

문제

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

 

20922번: 겹치는 건 싫어

홍대병에 걸린 도현이는 겹치는 것을 매우 싫어한다. 특히 수열에서 같은 원소가 여러 개 들어 있는 수열을 싫어한다. 도현이를 위해 같은 원소가 $K$개 이하로 들어 있는 최장 연속 부분 수열

www.acmicpc.net

접근 방법

dp문제인 줄 알았다.

근데 투 포인터 문제라고 하길래 투 포인터가 뭔지 검색해봤다.

투 포인터를 알고 나서 다시 봤는데도 구현방법이 떠오르지 않아서, 다른 사람이 푼 걸 봤다.

그냥 끝까지 구현 해볼 걸 그랬다.

할 수 있었을 거 같은데, 아쉽다.

코드

#include <iostream>
#include <vector>

using namespace std;

int main() {

    int n, k;
    cin >> n >> k;
    vector<int> arr(n, 0);
    for (int i=0;i<n;i++) {
        cin >> arr[i];
    }

    vector<int> cnt(100001, 0);
    int start = 0;
    int max_num = 0;
    for (int i=0;i<n;i++) {
        cnt[arr[i]]++;
        if (cnt[arr[i]] > k) {
            while(cnt[arr[i]] > k) {
                cnt[arr[start]]--;
                start++;
                if (start >= n) break;
            }
        }
        max_num = max(max_num, i - start + 1);
    }

    cout << max_num << endl;
    

    return 0;
}

개선할 점

문제에서 제시한 정수 범위를 잘 못 적어 2번 에러 났다.

문제를 잘 보자.