투 포인터 활용 문제이다.
데이터를 입력받고 오름차순으로 정렬을 한다.
최소값을 구하기위해서 최소값을 초기화 해주는데 약 10억 이상의 숫자를 해야될 것같다.
(처음에 습관처럼 987654321 -> 9억정도의 값으로 했다가 틀림, 문제를 잘 읽어보자)
먼저 l=0, r=0 부터 시작해서 포인터를 조건에 따라 움직여 줄건데, r을 먼저 움직일 것이다.
r은 A[r] - A[l]이 m보다 작을동안 계속 증가시켜준다 즉, 처음 A[r] - A[l]이 m 이상이게 될 때 멈춘다.
그 외의 경우에는 l을 증가 시켜준다. A[r] - A[l]이 m 이상이면서 차이가 가장 적은 값을 찾아주기 위해서다. 다시 A[r] - A[l]이 m보다 작아질 때에는 r을 다시 증가시켜주면 된다.
import java.io.*;
import java.util.*;
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
public static void main(String[] args) throws IOException {
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
ArrayList<Integer> list = new ArrayList<>();
for(int i=0;i<n;i++)
list.add(Integer.parseInt(br.readLine()));
Collections.sort(list);
int l =0, r= 0;
int min = 2100000000;
while(l<=r)
{
if(r+1 <n && list.get(r) - list.get(l) <m)
r++;
else
l++;
if(l < n && list.get(r)-list.get(l)>=m)
min = Math.min(list.get(r) - list.get(l),min);
}
bw.write(Integer.toString(min));
bw.flush();
}
}