코드
for tc in range(1, int(input())+1):
n, k = map(int, input().split())
candy = list(map(int, input().split()))
candy.sort()
ans = int(1e9)
for i in range(n-k+1):
gap = candy[i+k-1]-candy[i]
ans = min(ans, gap)
print(f"#{tc} {ans}")
이 문제는 주어진 주머니를 사탕의 개수를 기준으로 정렬한 뒤, 슬라이딩 윈도우를 이용하여 풀 수 있다.
자세히 말하자면, 사탕의 개수를 기준으로 정렬하면 연속된 K개의 주머니들을 골랐을 때 사탕의 개수가 가장 많은 것과 가장 적은 것의 사탕 개수 차이를 최대한 줄일 수 있다. 그리고 이 중에서도 가장 작은 차이를 갖는 것이 무엇인지 알기 위해 슬라이딩 윈도우로 K개의 주머니 덩어리를 하나씩 살펴보며 각 덩어리의 사탕 개수 차이값 중 최소를 구하면 된다.
이때 각 덩어리의 사탕 개수 차이값은 K개로 묶은 범위의 첫번째와 마지막 주머니의 차이를 구하면 된다.
'문제풀이 > 투포인터' 카테고리의 다른 글
[Python/파이썬] 백준 15831번 준표의 조약돌 (1) | 2025.01.03 |
---|---|
[Python/파이썬] 백준 1253번 좋다 (0) | 2024.06.28 |
[Python/파이썬] 백준 11687번 팩토리얼 0의 개수 (0) | 2024.02.25 |
[Python/파이썬] 백준 2559번 수열 (0) | 2024.01.31 |
[Python/파이썬] 백준 2018번 수들의 합 5 (0) | 2024.01.28 |