728x90
2230번: 수 고르기
N개의 정수로 이루어진 수열 A[1], A[2], …, A[N]이 있다. 이 수열에서 두 수를 골랐을 때(같은 수일 수도 있다), 그 차이가 M 이상이면서 제일 작은 경우를 구하는 프로그램을 작성하시오. 예를 들어
www.acmicpc.net
접근 방법
이분 탐색으로 이 문제를 해결하려고 했다.
두 수를 고르는 것이기 때문에 하나(i)를 for을 돌면서
각 수 위에서부터 끝까지(i+1~n) 수를 이분탐색을 하면서 돌면된다고 생각.
이분탐색의 경우, 하나를 모두 돌면서 진행되므로 O(N*logN)이 수행되지만,
이를 투포인터를 이용할 경우, 모든 수를 한 번씩만 돌기 때문에 O(N)에 수행이 가능하다.
따라서, 투포인터가 더 빠른 실행 시간을 자랑한다.
참고
글 읽기 - 이분탐색을 이용해서 해보려고 했습니다. 뭐가 문제일까요? (acmicpc.net)
글 읽기 - 이분탐색을 이용해서 해보려고 했습니다. 뭐가 문제일까요?
댓글을 작성하려면 로그인해야 합니다.
www.acmicpc.net
코드
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
#define ll long long
ll t, n, m;
ll res = 10000000000;
vector<ll> arr;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> n >> m;
for (int i = 0; i < n; i++) {
ll tmp;
cin >> tmp;
arr.push_back(tmp);
}
sort(arr.begin(), arr.end());
ll l = 0;
ll r = arr.size() - 1;
ll e = 0;
ll tmp = 0;
for (int s = 0; s < n; s++) {
while (e+1 < n && arr[e] - arr[s] < m) {
e++;
//cout << s <<" " << e << endl;
}
if (arr[e] - arr[s] == m) {
res = m;
break;
}
else if (arr[e]-arr[s] > m) {
res = min(res, arr[e] - arr[s]);
}
}
cout << res;
}
728x90
'📊알고리즘 > BOJ' 카테고리의 다른 글
BOJ 1644 - 소수의 연속합 (1) | 2024.04.23 |
---|---|
BOJ 1806 - 부분합 (1) | 2024.04.23 |
BOJ 2143 - 두 배열의 합 (0) | 2024.04.22 |
BOJ 3151 - 합이 0 (0) | 2024.04.17 |
BOJ 14921 - 용액 합성하기 (1) | 2024.04.16 |