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

[BOJ] 2473 세 용액 C++

Nakuri 2023. 2. 23. 10:24
728x90

개요

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

 

2473번: 세 용액

첫째 줄에는 전체 용액의 수 N이 입력된다. N은 3 이상 5,000 이하의 정수이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -1,000,000,000 이상

www.acmicpc.net

골드3 난이도 문제다.

풀이

2467번 용액

위 문제와 유사하지만 한 번 더 생각해야 하는 문제다.

3개의 용액을 합성해서 0에 가까운 경우를 구해야 한다.

투 포인터는 O(N)의 시간복잡도를 가진다.

따라서 앞에서부터 모든 원소를 기준으로 한 번씩 잡고, 해당 윈소 이후를 기준으로 양 끝에 투 포인터를 일일이 돌려준다면 O(N^2)가 나올 것이다.

N<=5000 이므로 위 방법으로 1초 이내 연산이 가능하다. (여유롭게 1억번 연산에 1초로 잡자)

코드

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

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

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

	while (front < back && ansSum)
	{
		mid = front + 1;
		back = N - 1;

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

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

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

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

	sort(water, water + N);

	TwoPointer();

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

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

[BOJ] 1253 좋다 C++  (0) 2023.02.23
[BOJ] 7453 합이 0인 네 정수 C++  (0) 2023.02.23
[BOJ] 2467 용액 C++  (0) 2023.02.20
[BOJ] 10025 게으른 백곰 C++  (1) 2023.02.20
[BOJ] 16953 A → B C++  (0) 2023.02.20