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

 

이번에 볼 문제는 백준 2473번 문제인 세 용액이다.
문제는 아래 링크를 확인하자.

www.acmicpc.net/problem/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

+ Recent posts