본문 바로가기
Coding Test

[Coding Test][Python][백준] BOJ #20922 겹치는 건 싫어

by 어떻게든 되겠지~ 2025. 2. 21.

 

 

#20922 겹치는 건 싫어

문제)

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

 

 이하의 양의 정수로 이루어진 길이가 인 수열이 주어진다.  이 수열에서 같은 정수를 개 이하로 포함한 최장 연속 부분 수열의 길이를 구하는 프로그램을 작성해보자.

입력)

첫째 줄에 정수 ()과 ()가 주어진다.

둘째 줄에는이 주어진다 ()

출력)

조건을 만족하는 최장 연속 부분 수열의 길이를 출력한다.


풀이)

※ 풀이 아이디어

전형적인 Two Pointer(Slinding Window) 문제입니다.

1. end Pointer를 계속 한 칸씩 이동시키며 특정 원소의 개수를 센다.
2. 만약 특정 원소의 개수가 $K$개 보다 많아지게 된다면 start를 조건이 만족될 때까지 한칸씩 이동 

 

N, K = map(int, input().split())

arr = list(map(int, input().split()))

start = 0
max_len = 0 
num_count = dict().fromkeys(list(range(1, max(arr)+1)), 0)

for end in range(N):
	# end Pointer를 계속해서 이동시킨다
    num_count[arr[end]] += 1
    
    # 조건을 만족하지 않을 때
    while num_count[arr[end]] > K:
        num_count[arr[start]] -= 1
        start += 1
	# 이동할 때마다 최대 길이 갱신
    max_len = max(max_len, end - start + 1)

print(max_len)

 

 

반응형