정렬과 투포인터를 활용해 문제를 풀 수 있다.
min보다 작으면 특성 값이 0에 가까우므로 교체해준다.
0보다 큰 경우와 0보다 작은 경우를 나누어서 투포인터를 구현한다.
받은 값들을 정렬한다.
0보다 크면 뒤의 인덱스를 땡긴다.
0보다 작으면 앞의 인덱스를 땡긴다.
(보다 0과 가까워져야하기 때문)
0과 같으면 멈춘다.(가장 최적이기 때문)
ex) -99 -2 -1 4 98
1) -99 + 98 = -1(최소)
2) -2 + 98 = 97(0보다 작아서 앞에꺼 땡김, 최소 갱신x)
3) -2 + 4 = 2(0보다 커서 뒤에꺼 땡김, 최소 갱신x)
4) -2 -1 = -3(0보다 작아서 앞에꺼 땡김, 최소 갱신x)
//백준 2470, 두 용액
#include <iostream>
#include <climits>
#include <algorithm>
int value[100'001];
int main (){
int N;
std::cin >> N;
for(int i{0}; i<N; ++i){
std::cin >> value[i];
}
std::sort(value, value+N);
int i{0}; int j{N-1};
int one{0}; int two{0};
int min{INT_MAX};
while(i < j){
if(abs(value[i] + value[j]) < min){
one = value[i];
two = value[j];
min = abs(value[i] + value[j]);
}
if(value[i]+value[j] == 0) break;
if(value[i]+value[j] > 0) --j;
else if(value[i] + value[j] < 0) ++i;
}
std::cout << one << ' ' << two;
return 0;
}