#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
int main() {
int N;
cin >> N;
vector<int> arr(N);
for (int i = 0; i < N; i++) {
cin >> arr[i];
}
int left = 0, right = N - 1;
int closestSum = 2'000'000'000; // 초기화 (문제 조건에서 절대 나올 수 없는 큰 값)
int answerLeft = 0, answerRight = 0;
while (left < right) {
int sum = arr[left] + arr[right];
// 현재 합이 0에 더 가까우면 갱신
if (abs(sum) < abs(closestSum)) {
closestSum = sum;
answerLeft = arr[left];
answerRight = arr[right];
}
// 합이 0보다 작으면 left를 오른쪽으로 이동
if (sum < 0) {
left++;
}
// 합이 0보다 크면 right를 왼쪽으로 이동
else {
right--;
}
}
// 결과 출력
cout << answerLeft << " " << answerRight << endl;
return 0;
}
투포인터 문제로, left, right의 두개의 포인터를 사용한다.
양 끝으로 투 포인터 각각을 초기화하고, 합 계산 및 최적화 탐색을 수행하면 된다.
'알고리즘' 카테고리의 다른 글
| BOJ 2240: 자두나무 (c++) (0) | 2025.03.30 |
|---|---|
| BOJ 4963: 섬의 개수 (c++) (0) | 2025.02.16 |
| BOJ 1995: 필터 (C++) (0) | 2025.01.12 |