본문 바로가기

Algorithm/Binary Search

(C++) - 백준(BOJ) 2230번 : 수 고르기

반응형

https://www.acmicpc.net/problem/2230

 

2230번: 수 고르기

N개의 정수로 이루어진 수열 A[1], A[2], …, A[N]이 있다. 이 수열에서 두 수를 골랐을 때(같은 수일 수도 있다), 그 차이가 M 이상이면서 제일 작은 경우를 구하는 프로그램을 작성하시오. 예를 들어

www.acmicpc.net

이분탐색 문제였습니다.

 

📕 풀이방법

📔 입력 및 초기화

 1. n, m, 수를 저장할 일차원 배열 a, 답을 저장할 변수 ans를 선언합니다. 2. n, m입력 후 n만큼 수를 a에 입력받습니다. 3. a를 오름차순으로 정렬해줍니다.

 

📔 풀이과정

 n만큼 loop를 돌며 현재보는 값이 a[i]일 때 a[i] + m이상인 index를 a에서 찾습니다. a[i] + m 이상인 값이 존재한다면 ans에 그 차이의 최솟값을 저장합니다.

 

📔 정답출력

ans를 출력합니다.


📕 Code

#include <bits/stdc++.h>
using namespace std;
int n, m, a[100001], ans = 0x3f3f3f3f;
int main(){
    cin >> n >> m;
    for(int i = 0; i < n; i++) cin >> a[i];
    sort(a, a + n);
    for(int i = 0; i < n; i++){
        auto idx = lower_bound(a, a + n, a[i] + m);
        if(idx != a + n)
            ans = min(ans,abs(a[i] - *idx));
    }
    cout << ans;
}