Koala - 11기/코딩테스트 준비 스터디
[백준/C++] 2467번: 용액
나는 푸딩
2023. 7. 28. 14:06
Problem
Solution
1) 변수 및 배열 선언 및 입력 받기
2) 두 개의 포인터를 사용하여 합이 0에 가까운 두 수를 찾기
두 개의 포인터 'left'와 'right'를 배열의 양 끝으로 초기화하고 합이 0에 가까운 두 수를 찾기 위해 'left' 포인터와 ' right' 포인터를 이동시키면서 최적의 값을 찾는다.
반복문은 'left'와 'right'가 같아질 때까지 계속 실행된다. 최솟값을 저장하는 'minVal'을 갱신하면서, 합이 0에 더 가까워질 때마다 그 때의 두 수를 'ans'에 저장한다.
3) 'ans' 벡터에 저장된 두 수를 출력한다.
Answer
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> li(n);
for (int i = 0; i < n; ++i) {
cin >> li[i];
}
int left = 0, right = n - 1;
int minVal = abs(li[left] + li[right]);
vector<int> ans = {li[left], li[right]};
while (left != right) {
if (minVal > abs(li[left] + li[right])) {
minVal = abs(li[left] + li[right]);
ans = {li[left], li[right]};
}
if (li[left] + li[right] >= 0) {
right--;
} else if (li[left] + li[right] < 0) {
left++;
}
}
for (int i : ans) {
cout << i << " ";
}
return 0;
}