[ BOJ / C++ ] 2470번 두 용액

황승환·2021년 7월 23일
0

C++

목록 보기
25/65

이번 문제는 투 포인터 알고리즘을 활용하여 해결하는 문제였다.
투 포인터 알고리즘

  • 배열을 정렬해준다.
  • start포인터는 0, end포인터는 n-1으로 초기화해준다.
  • 두 포인터가 가리키는 배열의 원소 합의 절댓값이 최솟값보다 작으면 최솟값에 저장해주고 이때의 각 포인터를 저장해준다.
  • 두 포인터가 가리키는 배열의 원소 합이 0보다 작다면 start를 증가시켜준다.
  • 두 포인터가 가리키는 배열의 원소 합이 0보다 크다면 end를 감소시켜준다.

Code

#include <iostream>
#include <algorithm>
#include <math.h>
#include <climits>
#define MAX 100001
using namespace std;

int n;
long long arr[MAX];
long long mini=LLONG_MAX;

void Input(){
    cin>>n;
    for(int i=0; i<n; i++){
        cin>>arr[i];
    }
}

void Solution(){
    sort(arr, arr+n);
    int start=0;
    int end=n-1;
    int ix1, ix2;
    while(start<end){
        long long sum=arr[start]+arr[end];
        if(llabs(sum)<mini){
            mini=llabs(sum);
            ix1=start;
            ix2=end;
        }
        if(sum<0){
            start++;
        }
        else{
            end--;
        }
    }
    cout<<arr[ix1]<<" "<<arr[ix2]<<endl;
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    Input();
    Solution();
    return 0;
}

profile
꾸준함을 꿈꾸는 SW 전공 학부생의 개발 일기

0개의 댓글