[백준 2467번 C/C++] 용액

 

https://www.acmicpc.net/problem/2467

 

2467번: 용액

첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하의 정수이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 오름차순으로 입력되며, 이 수들은 모두 -

www.acmicpc.net


 

해결전략

 

투포인터 알고리즘 two pointer algorithm

 


 

정답코드

 

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int n;
vector<int> v;

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);

	cin >> n;
	int input;
	for (int i = 0; i < n; i++) {
		cin >> input;
		v.push_back(input);
	}

	int neutral = 2147000000;
	vector<pair<int, int>> loc;
	int p1 = 0, pp1 = 0;
	int p2 = n - 1, pp2 = n - 1;
	while (p1 < p2)
	{
		int sum = v[p1] + v[p2];

		if (abs(sum) <= abs(neutral)) { // 현재 합이 이전 합보다 0에 더 가까운 경우
			neutral = sum;
			pp1 = p1;
			pp2 = p2;
		}

		if (abs(v[p1]) < abs(v[p2])) p2--;
		else p1++;
	}

	cout << v[pp1] << " " << v[pp2];

	return 0;
}