본문 바로가기

Algorithm/Binary Search

(C++) - 백준(BOJ) 2473번 : 세 용액 답

반응형

www.acmicpc.net/problem/2473

 

2473번: 세 용액

첫째 줄에는 전체 용액의 수 N이 입력된다. N은 3 이상 5,000 이하의 정수이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -1,000,000,000 이상

www.acmicpc.net

 

two pointer문제였습니다.

 

풀이방법 

 1. 첫 번째 용액 특성값을 first로 두고 n-2까지 loop를 돕니다.

 2. 나머지 first+1 ~ n - 1까지 two pointer로 정답을 찾습니다.

 3. 오름차순으로 정렬한 세 특성값을 출력합니다.

 

Code 

#include <iostream>
#include <algorithm>
#include <cmath>
#define ll long long
using namespace std;
ll liquid[5001];
ll answerArr[3];
int n;
void twoPointer(){
    ll result =  3e9;
    for(int first = 0; first < n - 2; first++){
        ll left = first+1;
        ll right = n-1;
        while(left < right){
            ll sum = liquid[left] + liquid[right] + liquid[first];
            if(abs(result) > abs(sum)){
                result = sum;
                answerArr[0] = liquid[first];
                answerArr[1] = liquid[left];
                answerArr[2] = liquid[right];
            }
            if(sum>=0) right--;
            else left++;
        }   
    }
    sort(answerArr,answerArr+3);
}

int main(){
    cin >> n;
    for(int i = 0; i < n; i++) cin >> liquid[i];
    sort(liquid,liquid+n);
    twoPointer();
    for(int i = 0; i < 3; i++) cout << answerArr[i] << ' ';
}