[백준/BOJ] 백준 2473번 : 세 용액

2021. 4. 9. 12:42알고리즘 문제풀이

www.acmicpc.net/problem/2473

 

2473번: 세 용액

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

www.acmicpc.net

입력받은 값을 정렬한 뒤, left는 고르고 고른 오른쪽에서 mid와 right를 가운데서 만나는 투 포인터를 이용해서 문제를 해결했다.

 

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

int n;
vector<long long> ph;
long long result_value = numeric_limits<long long>::max();
vector<long long> result(3, 0);

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

	cin >> n;

	for (int i = 0; i < n; i++)
	{
		long long input;
		cin >> input;

		ph.push_back(input);
	}

	sort(ph.begin(), ph.end());

	int left;
	int mid;
	int right;

	//left는 고르고 오른쪽에서 mid와 right를 가운데서 만나는 투포인터를 이용
	for (int i = 0; i < n - 2; i++)
	{
		left = i;
		mid = i + 1;
		right = n - 1;

		long long this_value;

		while (mid < right)
		{
			this_value = ph[left] + ph[mid] + ph[right];

			if (abs(result_value) > abs(this_value))
			{
				result_value = ph[left] + ph[mid] + ph[right];

				result[0] = ph[left];
				result[1] = ph[mid];
				result[2] = ph[right];
			}

			if (this_value < 0) //현재 값이 음수일때
				mid++;
			else if (this_value > 0) //현재 값이 양수일때
				right--;
			else //현재 값이 0일때
				break;
		}
	}

	for (int i = 0; i < 3; i++)
		cout << result[i] << " ";


	return 0;
}