문제 간략 설명

N개의 용액 특성값이 오름차순으로 주어진다. 각 용액은 산성(양수) 또는 알칼리성(음수)이며, 두 용액을 혼합했을 때의 특성값은 두 특성값의 합이다. 0에 가장 가까운 특성값을 만드는 두 용액을 찾아서 그 특성값을 출력한다.

풀이 방법

오름차순으로 정렬된 벡터를 이용하여 두 포인터(left, right) 접근법을 사용한다. 왼쪽과 오른쪽 포인터의 합을 구하고, 그 값이 양수인지, 음수인지에 따라 포인터를 조정하며 진행한다.

코드

#include <iostream>
#include <vector>
#include <cmath>
#include <cstdint>

using namespace std;

int N;
vector<int> vec;

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

	cin >> N;

	vec.resize(N);

	for (int i = 0; i < N; i++)
		cin >> vec[i];

	int left = 0, right = N - 1;
	int min = INT32_MAX;
	pair<int, int> res;

	while (left != right) {
		int sum = vec[left] + vec[right];
		int sum_abs = abs(sum);

		if (sum_abs < min) {
			res.first = left;
			res.second = right;
			min = sum_abs;
		}
		
		if (sum > 0)
			right--;
		else
			left++;
	}

	cout << vec[res.first] << " " << vec[res.second] << endl;

	return 0;
}

Key Points