개발/알고리즘

백준 2230) 수 고르기 골드 5 투 포인터

차가운콩 2024. 12. 10. 11:06

 

풀이:  가장 중요한 부분은 투 포인터 알고리즘을 활용하여 해결 하는 것입니다.

 

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;


}