문제 : https://www.acmicpc.net/problem/2470


[ 알고리즘풀이 ]

N이 100,000 이므로 Brute하게 이중 for문으로 풀면 시간초과에 직면하게 됩니다.

따라서, Input을 sorting 한 후, binary search 를 통해서 문제를 해결하면 O(NlogN + NlogN) 으로 해결할 수 있습니다. 

#include<iostream>
#include<vector>
#include<algorithm>
#define INF 999999999999999
using namespace std;

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

	int N, t;
	cin >> N;
	vector<int> list;
	for(int i = 0; i < N; i++){
		cin >> t;
		list.push_back(t);
	}
	int ans1, ans2;
	long long ansSum = INF;
	sort(list.begin(), list.end());
	for (int i = 0; i < N; i++) {
		int left = i + 1, right = N - 1;
		while (left <= right) {
			int mid = (left + right) / 2;
			long long sum = list[i] + list[mid];
			if (abs(sum) < ansSum) {
				ans1 = list[i], ans2 = list[mid];
				ansSum = abs(sum);
			}
			if (sum < 0)
				left = mid + 1;
			else
				right = mid - 1;
		}
	}
	cout << ans1 << ' ' << ans2;
	return 0;
}

 

+ Recent posts