본문 바로가기
📊알고리즘/BOJ

BOJ 14921 - 용액 합성하기

by meteorfish 2024. 4. 16.
728x90

14921번: 용액 합성하기 (acmicpc.net)

 

14921번: 용액 합성하기

홍익대 화학연구소는 다양한 용액을 보유하고 있다. 각 용액은 -100,000,000부터 100,000,000사이의 특성 값을 갖는데, 같은 양의 두 용액을 혼합하면, 그 특성값은 두 용액의 특성값의 합이 된다. 당신

www.acmicpc.net

 

접근방법

용액을 무조건 두 개씩 섞어서 0에 가깝게 만드는 문제이다. 전형적인 투포인터 문제다.

 

포인터를 두 개만들고(a, b), a는 0부터, b는 끝부터 내려온다.

만약, 두 포인터의 용액의 합이 0보다 작으면 용액의 합을 더 크게해야하기 때문에 a++.

반대로, 용액의 합이 작으면 용액의 값을 줄여야 하기 때문에 b--를 한다.

 

그리고 매번 용액의 합이 0에 최대한 가까운 합을 저장한다.

 

주의할 점은 용액의 합이 억 자리를 넘어가기 때문에 long long 으로 타입을 선언하자.

코드

#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#include<cmath>
#include<cstring>
#include<map>

using namespace std;

#define ll long long

ll n,m;
vector<ll> v;


int main() {
	cin.tie(NULL); ios_base::sync_with_stdio(false);
	cin >> n;

	for (int i = 0; i < n; i++) {
		ll tmp;
		cin >> tmp;
		v.push_back(tmp);
	}

	sort(v.begin(), v.end());

	ll a = 0, b = n - 1;
	ll res = 100000000001;
	ll total = 0;
	while (a < b) {
		ll cmp = abs(v[a] + v[b]);
		ll sum = v[a] + v[b];

		if (sum > 0) {
			b--;
		}
		else if (sum < 0) {
			a++;
		}
		else {
			res = 0;
			break;
		}

		if (abs(0 - sum) < abs(0-res)) {
			res = sum;
		}
		
	}

	cout << res;

	return 0;
}

728x90

'📊알고리즘 > BOJ' 카테고리의 다른 글

BOJ 2143 - 두 배열의 합  (0) 2024.04.22
BOJ 3151 - 합이 0  (0) 2024.04.17
BOJ 18869 - 멀티버스 II  (0) 2024.04.15
BOJ 2295 - 세 수의 합  (0) 2024.04.13
BOJ 16401 - 과자 나눠주기  (1) 2024.04.13