투 포인터라는 개념을 공부하고, 익힐 겸 풀어본 문제이다.
완전탐색 으로 모든 수의 조합을 확인해서도 풀 수 있는 문제이지만,
투 포인터 개념을 이용하면 으로 풀 수 있는 문제다.
수열 을 오름차순으로 정렬한 뒤, 2개 수의 차이 를 구해 과 비교한다면
아래 3가지 경우의 수가 나오게 된다.
각 경우의 수마다 아래와 같은 동작을 하면,
모든 숫자의 조합을 확인하지 않고 으로 문제를 풀 수 있다.
① : 를 증가시키기 위해 2번째 수를 더 큰 수로 사용한다.
② : 를 감소시키기 위해 1번째 수를 더 큰 수로 사용한다.
③ : 문제에서 요구하는 가장 작은 차이이기 때문에 탐색을 종료한다.
import sys
input = sys.stdin.readline
def solve():
N, M = map(int, input().split())
A = sorted(list({int(input()) for _ in range(N)}))
len_A = len(A)
ans, st, en = float('inf'), 0, 0
while st < len_A and en < len_A:
g = A[en] - A[st]
if g < M:
en += 1
else:
if g == M: return g
st += 1
ans = min(ans, g)
return ans
print(solve())