www.acmicpc.net/problem/2470

 

2470번: 두 용액

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

www.acmicpc.net

 

양수인 산성 용액과 음수인 알칼리성 용액이 주어지면 0과 가장 가까운 값의 두 구간을 찾는 문제다.

 

  • 투 포인터를 활용하기 위해서 배열을 정렬해준다
  • 왼쪽 포인터와 오른쪽 포인터 S = 0, E = n - 1로 설정해준다
  • vector에 <절댓값, 구간 2개> 로 입력받고
  • 두 구간의 합이 양수면 오른쪽을 줄이고
  • 음수면 왼쪽을 줄인다
  • 두 포인터가 서로 교차하면 종료
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int ar[100001], n, s, e;
vector<pair<int, pair<int, int>>> ans; 

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

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

	s = 0, e = n - 1; 
	while (s < e) { 
		ans.push_back({ abs(ar[s] + ar[e]),{ar[s],ar[e]} });
		if (ar[s] + ar[e] > 0) e--;
		else s++;
	}
	sort(ans.begin(), ans.end()); 

	cout << ans[0].second.first << ' ' << ans[0].second.second << endl;

	return 0;
}

 

처음엔 s<=e 로 설정해서 계속 틀렸다.

이분 탐색류는 경곗값 범위 설정을 조심히 다뤄야 하는 걸 다시 느낀다.

'BOJ' 카테고리의 다른 글

BOJ 4195 친구 네트워크  (0) 2020.10.17
BOJ 1976 여행 가자  (0) 2020.10.15
BOJ 7795 먹을 것인가 먹힐 것인가  (0) 2020.10.11
BOJ 1806 부분합  (0) 2020.10.10
BOJ 13414 수강 신청  (0) 2020.10.07

+ Recent posts