백준 문제풀이/골드5

백준 2470번 - 두 용액

void_melody 2022. 6. 9. 15:40

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

 

2470번: 두 용액

첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -1,000,000,000 이상 1,000,00

www.acmicpc.net

사고과정) 

두 개의 값의 합이 0에 가까워지려면 양 끝 값(제일 음수, 제일 양수)인 것들을 더한 다음 이것의 절댓값을 씌움으로써 

0과의 거리가 얼마나 가까운지를 파악했다.

두 값의 합이 음수면 음수쪽 값이 더 영향력이 있는 것이므로 음수의 칸을 한칸 옮겨주고

두 값의 합이 양수라면 양수쪽 값이 더 영향력 있는 것이므로 양수의 칸 한 칸 왼쪽으로 줄여주었다.

이를 투 포인터라고 한다.

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

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

	int n;
	cin >> n;
	vector<int> v;
	pair<int, int> result;
	int num;
	for (int i = 0; i < n; i++)
	{
		cin >> num;
		v.push_back(num);
	}
	sort(v.begin(), v.end());
	int start = 0;
	int end = n - 1;
	int min = INT_MAX;
	while (start < end)
	{
		int sum = v[start] + v[end];
		if (min > abs(sum))
		{
			min = abs(sum);
			result.first = v[start];
			result.second = v[end];
			if (sum == 0)
				break;
		}
		if (sum < 0)
			start++;
		else
			end--;
	}
	cout << result.first << ' ' << result.second;
	
	return 0;
	
}