문제풀이/백준oj
[백준OJ] 14921번 용액 합성하기
Hyeon-Uk
2021. 7. 21. 12:53
반응형
https://www.acmicpc.net/problem/14921
14921번: 용액 합성하기
홍익대 화학연구소는 다양한 용액을 보유하고 있다. 각 용액은 -100,000,000부터 100,000,000사이의 특성 값을 갖는데, 같은 양의 두 용액을 혼합하면, 그 특성값은 두 용액의 특성값의 합이 된다. 당
www.acmicpc.net
-풀이-
오름차순으로 정렬한 뒤(문제에서 정렬된 상태로 입력된다했으므로 생략) , 투포인터를 이용하여 두개의 포인터가 겹치기 전까지, 두 포인터가 가리키고 있는 용액값의 합의 절댓값이 작으면 갱신한 뒤, 용액의 값을 저장해둔다.
그런 뒤, 합이 음수면 left포인터를 ++, 합이 양수면 right포인터를 -- 해주면서 합이 0과 가까워 지도록 만들어주며 절댓값의 최솟값을 갱신시켜주면된다.
-시간복잡도-
오름차순 정렬을 안해주어도 되므로, O(N)이 된다.
-코드-
#include <algorithm>
#include<iostream>
#include<cmath>
using namespace std;
int n;
int arr[100010];
int main(){
cin.tie(NULL); cout.tie(NULL); ios_base::sync_with_stdio(false);
cin>>n;
for(int i=0;i<n;i++){
cin>>arr[i];
}
int left=0;
int right=n-1;
int min=987654321;
int result=-1;
while(left<right){
int s=arr[right]+arr[left];
if(abs(s)<min){
min=abs(s);
result=s;
}
if(s>0){
right--;
}
else{
left++;
}
}
cout<<result;
}
반응형