본문 바로가기

Algorithm/Sweeping

(C++) - 백준(BOJ) 2467번 : 용액

반응형

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

 

2467번: 용액

첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하의 정수이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 오름차순으로 입력되며, 이 수들은 모두 -

www.acmicpc.net

two pointer문제였습니다.

 

풀이방법

 1. l = 0, r = n-1로 시작해 두 용액의 합을 찾습니다.

 2. 두 용액의 합에 대해 절댓값이 더 작다면 현재 합을 갱신해줍니다. 그리고 정답에 대한 index 또한 갱신해줍니다.

 3. 현재 l과 r의 값 합이 0이면 loop를 탈출, 양수라면 양수가 있을 확률이 있는 r을 --, 음수라면 더 큰 값을 더해야하므로 l을 ++해주면서 원하는 값을 찾습니다. 

 

*자기 자신은 더하면 안되므로 while문은 l < r인 동안만 수행해야합니다.

 

Code

#include <bits/stdc++.h>
using namespace std;
int n;
int liquid[100001];
void twoPointer(){
    int l = 0, r = n - 1;
    int a,b;
    int sum = INT_MAX;
    while(l<r){
        int tmpSum = liquid[l] + liquid[r];

        if(abs(sum) > abs(tmpSum)) {
            sum = tmpSum;
            a = liquid[l];
            b = liquid[r];
        }

        if(tmpSum == 0) break;
        else if(tmpSum > 0) r--;
        else l++;
    }   
    cout << a << ' ' << b;
}

int main(){
    cin >> n;
    for(int i = 0; i < n; i++) cin >> liquid[i];
    twoPointer();
}