백준 2467번

Seungjae·2021년 6월 20일
0

알고리즘 문제풀이

목록 보기
18/27

백준 2467번 (용액)


양수의 산성 용액이 있고 음수의 알칼리 용액이 있을 때, 나열된 용액들 중 두 개를 골라서 0에 가장 가까운 값을 만드는 문제이다.

해당 문제는 이중포인터를 사용하여 해결하면 된다. 나열된 배열에 가장 왼쪽과 오른쪽을 가르킨다. 그리고 두 개의 합이 0보다 작으면 0이 되어야하므로 왼쪽을 한 칸 밀고, 0보다 크면 오른쪽을 한 칸 당긴다. 그리고 혹시 0이 된다면 그 때의 왼쪽 오른쪽이 가르키는 값을 순서대로 출력 후 프로그램을 종료하면 된다.

하지만 주의할 점은 문제는 0의 가장 가까운 값을 찾는다는 것이다. 즉 0이 나오지 않을 수도 있다. 따라서 앞에서 두 값을 더해서 절댓값을 구한 뒤 기존의 sum값과 비교하여 더 절댓값이 작은 값일 경우 결과가 되는 resultL, resultR을 최신화 시켜주는 로직을 추가할 필요가 있다.

#include <bits/stdc++.h>

using namespace std;

int main() {
	int n;
	scanf_s("%d", &n);

	vector<int> v(n + 1);

	int l = 0;
	int r = n - 1;

	for (int i = 0; i < n; i++)
		scanf_s("%d", &v[i]);

	int sum = abs(v[0] + v[n - 1]);
	int resultL = l;
	int resultR = r;

	while (l < r) {
		int tmp = v[l] + v[r];

		if (sum > abs(tmp)) {
			sum = abs(tmp);
			resultL = l;
			resultR = r;
		}

		if (tmp < 0) {
			l++;
		}
		else if (tmp == 0) { // 어차피 0일 경우 위에서 resultL과 resultR이 변경되었을 것이므로 또 처리해줄 필요 없다.
			break;
		}
		else {
			r--;
		}
	}

	printf("%d %d", v[resultL], v[resultR]);

	return 0;
}
profile
코드 품질의 중요성을 아는 개발자 👋🏻

0개의 댓글

관련 채용 정보