본문 바로가기
알고리즘

백준 s1 20922 겹치는 건 싫어 c++

by kyj0032 2024. 3. 4.

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

 

20922번: 겹치는 건 싫어

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

www.acmicpc.net

 

문제

길이가 N인 수열이 주어질 때, 같은 원소가 K개 이하인 최장 연속 부분 수열의 길이 구하기

 

풀이

 

수도코드

while // en번째를 추가할 차례
	cnt[en번째 수]++
    if cnt[en번째 수] > K
    	while cnt[en번째 수] > K
        	st++ 하면서 범위 줄이기
    
   	length = en-st+1
    answer = max(length, answer)
    
    en++

 

전체 코드

/*boj s1 20922 겹치는 건 싫어*/
#include <iostream>
#define MAXN 200005
using namespace std;

int N, K;
int a[MAXN];
int cnt[100005];
int main(void) {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> N >> K;
    for (int i = 0; i < N; i++)
        cin >> a[i];

    int st = 0;
    int en = 0;
    int ans = 0;
    int len = 0;
    while (st < N && en < N) { // en번째를 추가할 차례
        cnt[a[en]]++;

        if (cnt[a[en]] > K) {
            while (cnt[a[en]] > K) {
                cnt[a[st]]--;
                st++;
            }
        }

        len = en - st + 1;
        ans = max(ans, len);

        en++;
    }

    cout << ans << "\n";
}