풀이: 가장 중요한 부분은 투 포인터 알고리즘을 활용하여 해결 하는 것입니다.
n이 100,000까지니까 시간 복잡도 O(n 제곱)은 당연히 안될꺼라는 것을 아실겁니다.
투 포인터로 빠르고 간단하게 순회하기 위해서 vector에 값을 입력받고 오름차순 정렬 시켜주면 됩니다.
그리고 투 포인터의 while 조건이 중요합니다 -> while(i < n && j < n && i <= j)
당연히 i와 j는 n을 넘어가면 OutOfBounds 뜰 것 입니다. i가 j보다 커지는 것은 마이너스로 가기 때문에 m은 0 이상 값만
들어오니 i가 j를 넘어서는 상황은 고려하지 않습니다
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
long long n,m;
cin >> n >> m;
vector<long long> dp(n);
long long mins = 20000000000;
for(int i = 0; i < n; i++) {
cin >> dp[i];
}
sort(dp.begin(), dp.end());
int i = 0;
int j = 1;
while(i < n && j < n && i <= j) {
if(dp[j] - dp[i] >= m) {
mins = min(mins, dp[j] - dp[i]);
i++;
}
else {
j++;
}
}
cout << mins;
}
'개발 > 알고리즘' 카테고리의 다른 글
Thread (1) | 2025.05.12 |
---|---|
비트마스크 알고리즘 (0) | 2025.05.11 |
백준 1038) 감소하는 수 골드 5 - 백트래킹 (0) | 2024.12.10 |
백준 3745 ) 오름세 골드 2 LIS(n log n) (0) | 2024.12.06 |
백준 2610 ) 회의 준비 골드 2 C++ (0) | 2024.12.04 |