※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 2473번 문제인 세 용액이다.
문제는 아래 링크를 확인하자.
2473번: 세 용액
첫째 줄에는 전체 용액의 수 N이 입력된다. N은 3 이상 5,000 이하의 정수이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -1,000,000,000 이상
www.acmicpc.net
이 문제는 주어진 5000개의 정수 중 3개의 정수를 합해 만들 수 있는 0에 가장 가까운 정수를 만들 수 있는 세 정수를 출력하는 문제이다.
들어온 N개의 정수를 정렬하고, 가장 작은 정수서부터 그 정수를 포함하는 0에 가장 가까운 합을 투포인터를 이용하여 계산해내면 O(N^2)의 시간 내로 문제를 해결할 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <algorithm>
typedef long long ll;
using namespace std;
ll liq[5000];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int N; cin >> N;
for (int i = 0; i < N; i++) {
cin >> liq[i];
}
sort(liq, liq + N);
ll ans = 999999999999999LL;
ll a, b, c;
for (int i = 0; i < N; i++) {
ll liqi = liq[i];
int L = i + 1, R = N - 1;
while (L < R) {
ll current = liq[L] + liq[R] + liqi;
if (abs(current) < ans) {
ans = abs(current);
a = liqi, b = liq[L], c = liq[R];
}
if (current < 0) L++;
else R--;
}
}
cout << a << ' ' << b << ' ' << c;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 1197 // C++] 최소 스패닝 트리 (0) | 2021.05.26 |
---|---|
[BOJ 2628 // C++] 종이자르기 (0) | 2021.05.25 |
[BOJ 2887 // C++] 행성 터널 (0) | 2021.05.23 |
[BOJ 1028 // C++] 다이아몬드 광산 (0) | 2021.05.22 |
[BOJ 21600 // C++] 계단 (0) | 2021.05.21 |