문제
N개의 정수로 이루어진 수열 중 두 수를 골랐을 때(같은 수일 수도 있음) 차이가 M이상이면서 제일 작은 경우를 구하기
생각할 것
배열을 정렬하고, 투포인터를 이용해보기
start, end를 가장 처음에 둔다. (같은 수일 수도 있으므로)
차이가 M보다 작으면 키우기 위해 end를 옮기고, 크면 start를 옮긴다.
res의 초기 값을 res[N-1] - res[0]으로 설정해야한다.
코드
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int N, M;
cin >> N >> M;
vector<int> vec(N);
for (int i = 0; i < N; i++) {
cin >> vec[i];
}
sort(vec.begin(), vec.end());
int start = 0, end = 0, res = vec[N - 1] - vec[0];
while (start < N && end < N) {
int diff = vec[end] - vec[start];
if (diff < M) { // 차이가 M보다 작으면 end를 늘리기
end++;
} else { // 크면 뺴는 수를 늘리기
start++;
res = min(res, diff);
}
}
cout << res;
return 0;
}
반응형
'Problem solving > BOJ' 카테고리의 다른 글
[BOJ] 7785. 회사에 있는 사람 (C++) (0) | 2023.08.11 |
---|---|
[BOJ] 1920. 수 찾기 (C++) (0) | 2023.08.11 |
[BOJ] 2493. 탑 (C++) (0) | 2023.08.11 |
[BOJ] 1182. 부분수열의 합 (C++) (0) | 2023.08.08 |