홍대병에 걸린 도현이는 겹치는 것을 매우 싫어한다. 특히 수열에서 같은 원소가 여러 개 들어 있는 수열을 싫어한다. 도현이를 위해 같은 원소가 개 이하로 들어 있는 최장 연속 부분 수열의 길이를 구하려고 한다.
100 000 이하의 양의 정수로 이루어진 길이가 인 수열이 주어진다. 이 수열에서 같은 정수를 개 이하로 포함한 최장 연속 부분 수열의 길이를 구하는 프로그램을 작성해보자.
입력
첫째 줄에 정수 (1 ≤ N ≤ 200 000)과 K (1 ≤ K ≤ 100)가 주어진다.
둘째 줄에는 a_1, a_2, ... a_n이 주어진다 (1 ≤ a_i ≤ 100 000)
출력
조건을 만족하는 최장 연속 부분 수열의 길이를 출력한다.
풀이 과정
투 포인터를 이용하여 같은 정수를 K개 이하로 포함한 최장 연속 부분 수열의 길이를 구한다.
import sys
input = sys.stdin.readline
n, k = map(int, input().rstrip().split())
arr = list(map(int, input().rstrip().split()))
start = 0
end = 1
now = {i:0 for i in range(1, 100001)}
now[arr[0]] = 1
result = 0
while n >= end:
result = max(result, end - start)
if n == end: break
if n > end and now[arr[end]] < k:
now[arr[end]] += 1
end += 1
else:
while now[arr[end]] >= k and start < end - 1:
now[arr[start]] -= 1
start += 1
if start == end - 1:
now[arr[start]] -= 1
start += 1
now[arr[end]] += 1
end += 1
print(result)
'-- 예전 기록 > BOJ' 카테고리의 다른 글
[ BOJ ] 13414 : 수강신청 ( SILVER 3 ) / Python (0) | 2024.02.07 |
---|---|
[ BOJ ] 23634 : 미안하다 이거 보여주려고 어그로 끌었다 ( PLATINUM 4 ) / Python (1) | 2024.02.07 |
[ BOJ ] 5567 : 결혼식 ( SILVER 2 ) / Python (0) | 2024.02.06 |
[ BOJ ] 18917 : 수열과 쿼리 38 ( SILVER 3 ) / Python (0) | 2024.02.06 |
[ BOJ ] 15659 : 연산자 끼워넣기 (3) ( GOLD 4 ) / C (0) | 2024.02.05 |