문제 링크: https://www.acmicpc.net/problem/2473

 

두 용액과 비슷합니다. 투포인터로 풀면 됩니다.

투포인터 + 포인터 한개가 더 필요합니다. 즉 3개가 필요합니다.

 

일단 배열을 오름차순으로 정렬합니다.

i는 [0, n-3]이 되도록 하고, 반복문 안에서 j=i+1, k=n-1로 시작합니다. 그 뒤의 내용은 두 용액을 풀었을 때와 동일합니다.

이번에는 [-10억, 10억] 변수를 세 개를 더할 수 있으니 long long 등을 사용해 오버플로우를 방지해야 합니다.

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
const ll INF = numeric_limits<ll>::max();

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr), cout.tie(nullptr);

	int n;
	cin >> n;
	vector<ll> v(n);
	for (auto& c : v)
		cin >> c;
	sort(v.begin(), v.end());

	bool zero = false;
	ll min_diff = INF;
	int pi, pj, pk;

	for (int i = 0; i < n - 2 && !zero; ++i) {
		int j = i + 1;
		int k = n - 1;

		while (j < k) {
			ll sum = v[i] + v[j] + v[k];
			if (min_diff > abs(sum)) {
				min_diff = abs(sum);
				tie(pi, pj, pk) = { i, j, k };
			}
			
			if (sum == 0) {
				zero = true;
				tie(pi, pj, pk) = { i, j, k };
				break;
			}
			else if (sum > 0)
				--k;
			else
				++j;
		}
	}

	cout << v[pi] << ' ' << v[pj] << ' ' << v[pk] << '\n';

	return 0;
}

중간에 합이 0이 되면 모든 반복문 바로 빠져나오게 했습니다. i가 있는 for문 조건에 !zero가 보이시죠?

여러개 변수를 묶어서 변경할 때 tie를 써봤는데 깔끔하네요. 뭐 pi=i, pj=j, pk=k;랑 타자 수 차이가 별로 안나긴 합니다.

반응형

'Online Judge > 백준' 카테고리의 다른 글

[백준][C++] 2993: 세 부분  (0) 2020.07.09
[백준][C++] 1806: 부분합  (0) 2020.07.08
[백준][C++] 2470: 두 용액  (0) 2020.07.08
[백준][C++] 1987: 알파벳  (0) 2020.07.08
[백준][C++] 12852: 1로 만들기 2  (0) 2020.07.08