문제)
홍대병에 걸린 도현이는 겹치는 것을 매우 싫어한다. 특히 수열에서 같은 원소가 여러 개 들어 있는 수열을 싫어한다. 도현이를 위해 같은 원소가 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)
'Coding Test' 카테고리의 다른 글
| [Coding Test][Python][백준] BOJ #2304 창고 다각형 (0) | 2025.02.22 |
|---|---|
| [Coding Test][Python][백준] BOJ #1446 지름길 (0) | 2025.02.21 |
| [Coding Test][Python][백준] BOJ #2075 N번째 큰 수 (0) | 2025.02.21 |
| [Coding Test][Python][백준] BOJ #1406 에디터 (0) | 2025.02.21 |
| [Coding Test][Python][백준] BOJ #19637 IF 문 좀 대신 써줘 (0) | 2025.02.21 |