https://www.codetree.ai/missions/5/problems/group-of-pairs-2?&utm_source=clipboard&utm_medium=text
이전까지 문제들이 쉬운 관계로 좀 더 어려운 문제를 풀어보기로 했다.
문제를 읽어보면 2개의 수의 차이 중 최솟값이 최대가 되어야 한다.
이 말은 다르게 말하면 서로 비슷한 수의 차가 최대값이 되도록 하게 만들어야 한다는 것이다.
이를 토대로 다음과 같이 생각할 수 있다.
- 수를 입력 받는다.
- 수를 오름차순으로 정렬한다.
- 현 주소의 수와 그 다음 주소의 수의 차를 구한다.
- 그들 중 최대값을 구한다.
코드는 다음과 같다.
#include <iostream>
#include <vector>
#include <algorithm>
#include <limits>
#include <limits.h>
#include <cmath>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> arr(2 * n);
for (int i = 0; i < 2 * n; i++) {
cin >> arr[i];
}
// 배열을 정렬합니다.
sort(arr.begin(), arr.end());
for(int i = 0; i < arr.size(); i++) {
cout << arr[i] << " ";
}
cout << endl;
// 두 원소의 차이의 최솟값을 최대화하기 위해
long long min_diff = LLONG_MAX; // 최대값 지정
for (int i = 0; i < n; i++) {
min_diff = min(min_diff, static_cast<long long>(arr[n + i] - arr[i]));
}
cout << min_diff << endl;
return 0;
}
여기서 static_cast는 해당 수의 차이를 정적 longlong 타입으로 보정해주는 함수이다.
여기서 주의해야 할 것은 바로 이 부분인데
n과 주어지는 수의 범위가 매우 크기 때문에 int 범위를 벗어나는 수가 주어질 수 있다. 따라서 최대 범위인 longlong을 사용하는 것이 좋다.
또한 static_cast를 사용하지 않으면 컴파일을 할 때 오류가 날 수 있기 때문에 반드시 사용해주는 게 좋다.