본문 바로가기
ps

[백준] 2473 - 세 용액

by kariskan 2022. 8. 26.

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

 

2473번: 세 용액

첫째 줄에는 전체 용액의 수 N이 입력된다. N은 3 이상 5,000 이하의 정수이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -1,000,000,000 이상

www.acmicpc.net

 

두 용액에서 업그레이드된 버전이다.

사실 그냥 for 한 번만 더 넣으면 되긴 하다.

 

미리 배열을 정렬 시키고 이중 for문으로 첫 번째, 두 번째 용액을 골라준다. 세 번째 용액까지 완전 탐색을 해버리면 TLE가 나기 때문에 정렬된 배열로 이분 탐색을 해준다. 

 

이분 탐색의 기준은,

세 용액의 합이 0보다 크면 right = mid - 1

세 용액의 합이 0보다 작으면 left = mid + 1

 

따라서 다음과 같이 구현할 수 있다.

 

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

long long n, a[5000], an[3];

int main() {

	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	cin >> n;

	for (int i = 0; i < n; i++) {
		cin >> a[i];
	}
	
	sort(a, a + n);

	long long ans = LLONG_MAX;

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

			int left = j + 1;
			int right = n - 1;
			int mid = (left + right) / 2;

			while (left <= right) {
				mid = (left + right) / 2;
				if (a[i] + a[j] + a[mid] > 0) {
					right = mid - 1;
				}
				else {
					left = mid + 1;
				}

				if (ans > abs(a[i] + a[j] + a[mid])) {
					ans = abs(a[i] + a[j] + a[mid]);
					an[0] = a[i];
					an[1] = a[j];
					an[2] = a[mid];
				}
			}
		}
		
	}

	cout << an[0] << ' ' << an[1] << ' ' << an[2];
}

'ps' 카테고리의 다른 글

[백준] 2228 - 구간 나누기  (1) 2022.09.01
[백준] 13302 - 리조트  (0) 2022.09.01
[백준] 1761 - 정점들의 거리  (0) 2022.08.26
[백준] 1493 - 박스 채우기  (0) 2022.08.26
[백준] 1374 - 강의실  (0) 2022.08.26

댓글