홍대병에 걸린 도현이는 겹치는 것을 매우 싫어한다. 특히 수열에서 같은 원소가 여러 개 들어 있는 수열을 싫어한다. 도현이를 위해 같은 원소가 개 이하로 들어 있는 최장 연속 부분 수열의 길이를 구하려고 한다.
이하의 양의 정수로 이루어진 길이가 인 수열이 주어진다. 이 수열에서 같은 정수를 개 이하로 포함한 최장 연속 부분 수열의 길이를 구하는 프로그램을 작성해보자.
첫째 줄에 정수 ()과 ()가 주어진다.
둘째 줄에는 이 주어진다 ()
조건을 만족하는 최장 연속 부분 수열의 길이를 출력한다.
(two point 알고리즘)
1. 배열을 순회하는 시작점과 끝점을 정하기
2. 끝점을 이동하면서 해당 원소의 개수를 체크
3. 해당 원소가 최대 개수보다 많아지는 경우 시작점을 이동하며 원소의 개수는 제외 시키기
4. 길이는 원소를 제외시키기 전의 길이가 됨
5. 이런 식으로 포인트를 이동하며 최대 길이를 구하기
6. 끝점이 배열의 마지막 원소의 개수를 체크했을 때 순회 종료
check_arr = [0]*100001
s=0
e=0
n,k = map(int, input().split())
arr = list(map(int, input().split()))
max_len = 0
while True:
if e == n:
max_len = max(max_len, e - s)
break
if check_arr[arr[e]] == k:
check_arr[arr[s]]-=1
max_len = max(max_len, e-s)
s += 1
else:
check_arr[arr[e]]+=1
e += 1
print(max_len)