Algorithm/백준

[백준][C++] 2467번: 용액 <206>

샤아이인 2022. 3. 28.

직접 풀어보고 올리는 코드입니다. 지적이나 더 좋은 방향에 대한 댓글은 항상 환영합니다.

 

 

2467번: 용액

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

www.acmicpc.net

생각의 흐름

투포인트 알고리즘을 적용하면 된다.

 

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

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

 3) 현재 left과 right의 값 합이 0이면 loop를 탈출, 양수라면 양수가 있을 확률이 있는 right index를 -1, 음수라면 더 큰 값을 더해야하므로 left을 +1 해주면서 값을 찾아간다.

 

나의 코드

#include <bits/stdc++.h>
using namespace std;

int N;

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    cin >> N;
    vector<int> vec(N);
    for(int i = 0; i < N; i++){
        int num;
        cin >> num;
        vec[i] = num;
    }
    sort(vec.begin(), vec.end());

    int left = 0;
    int right = N-1;

    int resA, resB;

    int min = 2147000000;
    while(left < right) {
        int midValue = vec[left] + vec[right];
        if(min > abs(midValue)) {
            min = abs(midValue);
            resA = vec[left];
            resB = vec[right];
        }

        if(midValue < 0) {
            left++;
        }else if(midValue >= 0) {
            right--;
        }
    }

    cout << resA << " " << resB;

    return 0;
}

댓글