백준/실랜디, 골랜디

[백준] C++ 세 용액(2473)

2zreal 2025. 1. 23. 19:50

이 문제는 용액과 비슷한 문제이다.

세 종류의 용액을 합쳐서 그 합이 0에 가장 가깝게 만드는게 목표이다.

 

용액 문제는 두 개의 용액을 합쳐서 그 합이 0에 가장 가깝게 만드는 문제였다.

 

이렇게 시작점과 끝점에 S와 E를 두고 합쳤을 때 합이 만약 0보다 크면 e를 --해주고 합이 0보다 작으면 s를 ++해줘서 문제를 해결해 주었다.

 

세 용액은 두 가지의 용액이 아니라 세 가지의 용액을 가지고 합이 0에 가깝게 만드는 목표이다. 그러면 어떻게 하면 세 가지 용액을 구할 수 있을까?? 위 용액문제에서 조금만 수정하면 된다.

-97을 무조건 하나의 용액에 포함한다고 가정하자. 그러면 나머지 두 용액의 합이 97이 되어야 합이 0이 될 것이다. 나머지 두 용액의 합이 97에 가장 가까운 조합을 찾으면 된다.

 

-97에 대한 계산이 완료되었으면 이번에는 -6을 무조건 포함시킨다.

나머지 두 용액의 합이 6에 가까운 조합을 찾는다.(왜 -97은 이제 계산에 포함을 안 시키는가?? 이미 이전에 -97을 포함한 조합을 모두 살펴보았기 때문에 볼 필요가 없음.)

이런 식으로 문제를 해결하면 된다.

 

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

long long arr[5001];

int main(void)
{
	int N = 0;
	cin >> N;

	for (int i = 0; i < N; i++)
	{
		cin >> arr[i];
	}

	sort(arr, arr + N);



	int result1 = 0;
	int result2 = 0;
	int result3 = 0;

	long long min = 3000000001;
	for (int i = 0; i < N - 2; i++)
	{
		int start = i + 1;
		int end = N - 1;
		while (start < end)
		{
			long long sum = arr[start] + arr[end] + arr[i];
			if (min > abs(sum))
			{
				min = abs(sum);
				result1 = arr[i];
				result2 = arr[start];
				result3 = arr[end];
			}

			if (arr[start] + arr[end] > -arr[i])
			{
				end--;
			}
			else
			{
				start++;
			}

		}
	}



	cout << result1 << " " << result2 << " " << result3;

	return 0;
} //-97 -6 -2 6 98