※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 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
'BOJ' 카테고리의 다른 글
[BOJ 26763 // C++] Liczby silne (0) | 2023.07.27 |
---|---|
[BOJ 26748 // C++] Antypalindrom (0) | 2023.07.26 |
[BOJ 17265 // C++] 나의 인생에는 수학과 함께 (0) | 2023.07.24 |
[BOJ 26740 // C++] Nawiasowania (0) | 2023.07.23 |
[BOJ 21772 // C++] 가희의 고구마 먹방 (0) | 2023.07.22 |