백준 2470 두 용액 (C++)

안유태·2022년 11월 14일
0

알고리즘

목록 보기
76/239

2470번: 두 용액

투 포인터를 이용한 문제이다. 문제에서 요구하는 것은 합이 0에 가까운 두 용액을 구하는 것이다. 그래서 우선 입력받은 값들을 정렬을 해주어 첫번째 값과 마지막 값을 시작으로 합을 구해가며 반복문을 돌려주었다. 만약 두 용액의 합이 음수라면 start 위치를 다음으로 넘겨 음수 값을 낮춰주고 반대면 end 위치를 이전으로 넘겨주었다. 두 용액의 합의 절대값이 0과 가까우면 startend의 위치를 저장해주고 0이라면 바로 반복문을 멈추고 출력해주었다.
이전에 풀었던 투 포인터 문제와 유사하여 어렵지 않게 풀 수 있었다.



#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int N;
vector<int> v;

void solution(){
    int start = 0, end = N - 1, a, b;
    int sum = 2000000000;

    sort(v.begin(), v.end());
    
    while (start < end) {
        int tmp = v[start] + v[end];

        if (sum > abs(tmp)) {
            sum = abs(tmp);
            a = start;
            b = end;

            if (sum == 0) break;
        }

        if (tmp < 0) {
            start++;
        }
        else {
            end--;
        }
    }

    cout << v[a] << " " << v[b];
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);

    cin >> N;

    for (int i = 0; i < N; i++) {
        int a;
        cin >> a;
        v.push_back(a);
    }

    solution();

    return 0;
}
profile
공부하는 개발자

0개의 댓글