백준문제풀이

백준 문제 14921번 용액 합성하기 문제풀이 c++

노가다 김씨 2022. 3. 20. 22:30

https://www.acmicpc.net/problem/14921

 

14921번: 용액 합성하기

홍익대 화학연구소는 다양한 용액을 보유하고 있다.  각 용액은 -100,000,000부터 100,000,000사이의 특성 값을 갖는데, 같은 양의 두 용액을 혼합하면, 그 특성값은 두 용액의 특성값의 합이 된다. 당

www.acmicpc.net

 

문제해석

 

이런 비슷한 문제를 예전에 풀었을때 이분 탐색 비슷하게 풀었는데 투 포인터로도 풀 수있는걸 확인하고 이번엔 그렇게 풀어보았다.

 

입력이 정렬 된 상태로 들어오기 때문에 정렬하진 않았지만 그렇지 않다면 정렬을 한다.

처음과 끝을 가리키는 포인터를 두고 절댓값이 큰 쪽의 포인터를 이동 하는 식으로 서로의 포인터가 교차할때까지 반복한다.

 

물론 포인터가 움직일때마다 용액의 특성이 더 0에 가까워지면 답을 업데이트 해준다.

 

이렇게 작성하면 이분탐색보다 훨씬 짧고 간결하게 작성 하는것이 가능했다.

 

코드

 

#include <iostream>
#include <cmath>
using namespace std;
int a[100000];
int ans=999999999;
int main(){
    cout.tie(NULL);
    cin.tie(NULL);
    ios_base::sync_with_stdio(false);
    int n;
    cin>>n;
    for(int i=0; i<n; i++)
    {
        cin>>a[i];
    }
    int start=0;
    int end=n-1;
    while(start<end)
    {
        if(abs(a[start]+a[end])<abs(ans))
        {
            ans=a[start]+a[end];
        }
        if(abs(a[start])<abs(a[end]))
        {
            end=end-1;
        }
        else
        {
            start=start+1;
        }
    }
    cout<<ans;
}