문제)
홍대병에 걸린 도현이는 겹치는 것을 매우 싫어한다. 특히 수열에서 같은 원소가 여러 개 들어 있는 수열을 싫어한다. 도현이를 위해 같은 원소가 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 |