투 포인터를 이용한 문제이다. 두 값의 차이가 M
이상인 최솟값을 구해야하므로 이번엔 첫 인덱스부터 점점 범위를 넓혀가는 식으로 값을 구해보았다. 먼저 입력받은 값을 정렬을 해준 후 start = 0
과 ebd = 1
에서 시작해 반복문을 돌며 두 값의 차이가 M
보다 작을 경우 end++
를 해준다. 차이가 M
과 같다면 반복문을 끝내고 출력을 해주게 된다. 둘 다 아니라면 result
와 비교해 작은 값을 저장해주고 start++
를 해준다. 어렵지 않게 풀 수 있었던 문제였다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int N, M, result = 2000000001;
vector<int> v;
void solution() {
sort(v.begin(), v.end());
int start = 0, end = 1;
while (start < N && end < N) {
int dif = v[end] - v[start];
if (dif < M) {
end++;
continue;
}
else if (dif == M) {
result = dif;
break;
}
result = min(result, dif);
start++;
}
cout << result;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin >> N >> M;
int a;
for (int i = 0; i < N; i++) {
cin >> a;
v.push_back(a);
}
solution();
return 0;
}