https://www.acmicpc.net/problem/20922
문제
길이가 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";
}
'알고리즘' 카테고리의 다른 글
백준 g4 13144 List of Unique Numbers c++ (0) | 2024.03.04 |
---|---|
백준 g5 22862 가장 긴 짝수의 연속한 부분 수열(large) c++ (0) | 2024.03.04 |
백준 g4 1644 소수의 연속합 c++ (0) | 2024.03.02 |
백준 s1 2531 회전 초밥 c++ (0) | 2024.03.02 |
백준 s4 2003 수들의 합 2 c++ (0) | 2024.03.01 |