문제 https://www.acmicpc.net/problem/2470
2470번: 두 용액
첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -1,000,000,000 이상 1,000,00
www.acmicpc.net
풀이
이분탐색과 투포인터 문제이다.
벡터의 첫 원소를 시작으로 기준 원소를 정한다. 그 후, 그 외의 원소들을 이분탐색한다.
각 원소들과 기준 원소의 차이를 비교하며 가장 차이가 적은 원소 2개를 찾는다.
주의할 점! 용액 하나가 10억의 값을 가질 수 있으므로 넘을 수 있으므로 최소값에 넣어 둔 값을 20억 정도로 해줘야 함.
코드
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
vector<int> v;
int N;
cin >> N;
for (int i = 0; i < N; i++) {
int a;
cin >> a;
v.push_back(a);
}
sort(v.begin(), v.end());
int minVal = 2147483647;
int idx = 0;
int min1, min2;
while (idx < N - 1) {
int low = idx + 1, high = N - 1;
while (low <= high) {
int mid = (low + high) / 2;
if (v[mid] + v[idx] == 0) {
minVal = 0;
min1 = v[idx];
min2 = v[mid];
break;
} else if (v[mid] + v[idx] < 0) {
if (abs(v[mid] + v[idx]) < minVal) {
minVal = abs(v[mid] + v[idx]);
min1 = v[idx];
min2 = v[mid];
}
low = mid + 1;
} else {
if (abs(v[mid] + v[idx]) < minVal) {
minVal = abs(v[mid] + v[idx]);
min1 = v[idx];
min2 = v[mid];
}
high = mid - 1;
}
}
idx++;
}
cout << min1 << " " << min2;
}
'알고리즘 > 문제 풀이' 카테고리의 다른 글
백준 14226 - 이모티콘 (C++) (0) | 2024.03.22 |
---|---|
백준 23300 - 웹 브라우저 2 (C++) (0) | 2024.03.21 |
누적 합 (0) | 2024.03.11 |
백준 2343 - 기타 레슨(C++) (0) | 2023.12.08 |
백준 1753 - 최단경로(C++) (1) | 2023.11.29 |