https://www.acmicpc.net/problem/2467
문제 풀이
이 문제는 예전에 풀었던 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
소스 코드
#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';
}
'알고리즘' 카테고리의 다른 글
[백준] 9252번 LCS 2 C++ 문제풀이 (0) | 2024.01.09 |
---|---|
[백준] 9251번 LCS C++ 문제풀이 (0) | 2024.01.08 |
[백준] 14502번 연구소 C++ 문제풀이 (0) | 2024.01.08 |
[백준] 11660번 구간 합 C++ 문제풀이 (0) | 2024.01.02 |
[백준] 15650번 N과 M C++ 문제풀이 (1) | 2024.01.01 |