기본 아이디어는 정렬을 한 후, 두 원소를 더한 값의 절대값을 최소로 만드는 것을 찾는 것입니다.
처음에는, 밑에 코드처럼 Brute Force로 했습니다.
결과는 시간초과였습니다.for(int i = 0; i < size; i++) { for(int j = size - 1; j >= i && j != i; j--) { int tempSum = solution[i] + solution[j]; if(abs(tempSum) < abs(sum)) { sum = tempSum; anwser[0] = solution[i]; anwser[1] = solution[j]; } } }
그래서 다른 방법을 생각했습니다.
더한값의 절대값이 최소가 되는 방향으로만 비교할 수 있도록 코드를 바꿔주었습니다.
앞에서부터 오는 인덱스, 뒤에서부터 오는 인덱스를 조작해서 해결했습니다.
(투포인터)
현재 계산한 값이 음수이면 앞에서 오는 인덱스를 +1해주었고,
양수이면 뒤에서 오는 인데스는 -1해주었습니다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> solution;
void findValue() {
int sum = 2000000000;
int size = solution.size();
int answer[2];
int i = 0;
int j = size - 1;
while (i < j) {
int tempSum = solution[i] + solution[j];
if(abs(sum) > abs(tempSum)) {
sum = tempSum;
answer[0] = solution[i];
answer[1] = solution[j];
if(sum == 0 ){
break;
}
}
if(tempSum < 0) {
i++;
}
else {
j--;
}
}
cout << answer[0] << " " << answer[1];
}
int main() {
int N;
cin >> N;
while(N--) {
int value;
cin >> value;
solution.push_back(value);
}
sort(solution.begin(), solution.end());
findValue();
return 0;
}