※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 2295번 문제인 세 수의 합이다.
문제는 아래 링크를 확인하자.

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

 

2295번: 세 수의 합

우리가 x번째 수, y번째 수, z번째 수를 더해서 k번째 수를 만들었다라고 하자. 위의 예제에서 2+3+5=10의 경우는 x, y, z, k가 차례로 1, 2, 3, 4가 되며, 최적해의 경우는 2, 3, 4, 5가 된다. k번째 수가 최

www.acmicpc.net

A+B+C=K를 만족하는 네 수는 (A+B)=(K-C) 또한 만족함을 관찰하자.

 

이를 이용해 두 수의 합들과 (두 수의 차, 그 때의 K)의 순서쌍들을 각각 구해 정렬 후 투포인터를 이용해 문제를 해결하자.

 

아래는 제출한 소스코드이다.

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

int N;
int num[1000];
vector<int> num1;
vector<pair<int, int>> num2;
int ans, numsize;
int idx1, idx2;

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

	cin >> N;
	for (int i = 0; i < N; i++) cin >> num[i];
	for (int i = 0; i < N; i++) {
		for (int j = i; j < N; j++) {
			num1.emplace_back(num[i] + num[j]);
			num2.emplace_back(make_pair(abs(num[i] - num[j]), max(num[i], num[j])));
		}
	}

	sort(num1.begin(), num1.end());
	sort(num2.begin(), num2.end());

	numsize = num1.size();
	while (idx1 < numsize && idx2 < numsize) {
		if (num1[idx1] < num2[idx2].first) idx1++;
		else if (num1[idx1] > num2[idx2].first) idx2++;
		else {
			ans = max(ans, num2[idx2].second);
			idx1++, idx2++;
		}
	}

	cout << ans;
}
728x90

+ Recent posts