알고리즘&자료구조/문제

[BOJ] 2467 용액 C++

Nakuri 2023. 2. 20. 04:55
728x90

개요

https://www.acmicpc.net/problem/2467

 

2467번: 용액

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

www.acmicpc.net

골드5 난이도 문제다.

풀이

특성값의 합이 0에 가까운 두 용액을 찾아야 한다.

용액의 특성값을 정렬한 후 투 포인터를 사용해 풀었다.

front(가장 작은 값)과 end(가장 큰 값) 일 비교한다.

0보다 클 경우 end-1 하여 감소시키고 0보다 클 경우 front+1을 해주어 증가시킨다.

위를 반복하며 0과 가장 가까운 조합을 찾아낸다.

여러 답중 아무거나 출력해도 되므로 그냥 출력하면 된다.

코드

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
constexpr int LIMIT = 100002;

int N;
int water[LIMIT];
int ansFront, ansBack;

void TwoPointer()
{
	int front = 0;
	int back = N - 1;
	long long sum = 0;
	long long ansSum = 10000000000;

	while (front != back && ansSum)
	{
		sum = water[front] + water[back];
		if (abs(ansSum) > abs(sum))
		{
			ansSum = sum;
			ansFront = water[front];
			ansBack = water[back];
		}

		if (sum < 0) front++;
		else back--;
	}
}

int main() 
{
	cin.tie(0)->sync_with_stdio(0);

	cin >> N;
	for (int i = 0; i < N; i++)
	{
		cin >> water[i];
	}

	TwoPointer();

	cout << ansFront << " " << ansBack;
}

'알고리즘&자료구조 > 문제' 카테고리의 다른 글

[BOJ] 7453 합이 0인 네 정수 C++  (0) 2023.02.23
[BOJ] 2473 세 용액 C++  (0) 2023.02.23
[BOJ] 10025 게으른 백곰 C++  (1) 2023.02.20
[BOJ] 16953 A → B C++  (0) 2023.02.20
[BOJ] 12851 숨바꼭질 2 C++  (0) 2023.02.20