본문 바로가기

알고리즘

[백준] 2467번 용액 C++ 문제풀이

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

 

2467번: 용액

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

www.acmicpc.net

문제 풀이

이 문제는 예전에 풀었던 14767번이랑 비슷하게 문제를 해결했다

0에 가장 가까운 값을 만드는 2개의 용액을 찾으면 되는 문제이므로 하나의 vector 배열에 모든 값을 저장한다.

이때 음수인 값은 양수로 바꾼 후 저장하는 대신 -1을 pair의 second로 저장하고 양수인 경우는 pair의 second에 1을 저장한 뒤 정렬을 한다 

예를 들어, -99 -2 -1 4 98 이 입력으로 들어왔다고 가정하면,  vector에는 (1,-1), (2,-1), (4,1), (98,1), (99,-1) 가 저장되어있다. 

vector의 앞, 뒤를 비교해가면서 second의 값이 다르면 빼기를, 같으면 더하기를 해서 0에 가장 가까운 인덱스를 출력하는 코드를 작성했다.

https://itcodeheaven.tistory.com/57

 

[백준] 14746번 Closest Pair C++ 문제풀이

https://www.acmicpc.net/problem/14746 14746번: Closest Pair Your program is to read from standard input. The input consists of four lines. The first line contains two integers, n (1 ≤ n ≤ 500,000) and m (1 ≤ m ≤ 500,000), where n is the number of

itcodeheaven.tistory.com

소스 코드

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

vector<pair<long long, int>> liquid;

int main() {
	int n;
	cin >> n;
	for (int i = 0; i < n; i++) {
		long long a;
		cin >> a;
		if (a < 0)
			liquid.push_back(make_pair(-1 * a, -1));
		else {
			liquid.push_back(make_pair(a, 1));
		}
	}
	sort(liquid.begin(), liquid.end());
	
	//0에 가까운 인덱스 값 찾기
	long long zero = 2000000000;
	int idx = 0;
	for (int j = 0; j < liquid.size() - 1; j++) {
		int sum = 0;
		if (liquid[j].second != liquid[j + 1].second) {
			sum = abs(liquid[j].first - liquid[j + 1].first);
		}
		else {
			sum = abs(liquid[j].first + liquid[j + 1].first);
		}
		if (sum < zero) {
			zero = sum;
			idx = j;
		}
	}
	// 결과 출력을 위해 오름차순 정렬
	int first_num = liquid[idx].first * liquid[idx].second;
	int second_num = liquid[idx + 1].first * liquid[idx + 1].second;
	if (first_num < second_num) 
		cout << first_num << " " << second_num << '\n';
	else 
		cout << second_num << " " << first_num << '\n';
}