https://www.acmicpc.net/problem/2467
2467번: 용액
첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하의 정수이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 오름차순으로 입력되며, 이 수들은 모두 -
www.acmicpc.net
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n;
pair<int, int> ans;
cin >> n;
vector<int> liq(n);
for (int i = 0; i < n; i++) {
cin >> liq[i];
}
int s = 0;
int e = n - 1;
ans = {liq[s], liq[e]};
while (s < e) {
ans = abs(ans.first + ans.second) > abs(liq[s] + liq[e]) ? make_pair(liq[s], liq[e]) : ans;
if (ans.first + ans.second == 0) {
break;
}
if (liq[s] + liq[e] < 0) {
s++;
} else {
e--;
}
}
cout << ans.first << " " << ans.second;
return 0;
}
두 수의 합이 0에 가깝다는 건 합의 절댓값이 최소여야 한다는 뜻을 의미한다.
정렬된 용액이 주어지므로 양쪽 끝을 포인터로 잡고 연산을 수행한다.
두 용액의 합이 음수일 때: 왼쪽 포인터를 옮겨 음수의 영향을 줄인다.
두 용액의 합이 양수일 때: 오른쪽 포인터를 옮겨 양수의 영향을 줄인다.
위 과정을 수행하면서 처음보다 두 포인터가 가리키고 있는 용액의 합의 절댓값이 최소가 될 경우, 정답의 용액을 갱신한다.
'Coding Test' 카테고리의 다른 글
백준 2512 예산 (0) | 2024.04.02 |
---|---|
백준 15657 N과 M(8) (1) | 2024.04.01 |
백준 5639 이진 검색 트리 (1) | 2024.03.31 |
백준 9342 염색체 (0) | 2024.03.29 |
백준 15685 드래곤 커브 (0) | 2024.03.28 |