문제 링크입니다: https://www.acmicpc.net/problem/2473
첫 번째 용액을 기준으로 나머지 두 용액은 양방향 탐색을 통해 세 용액의 합의 최소값을 찾는 문제였습니다.
사실 구현보다는 long long 자료형의 최대값을 정의하는데 애를 먹었던 문제였습니다.
처음에는 numeric_limits<long long>::infinity()로 minimum을 초기화했는데 오답처리를 받아 minimum 값을 확인한 결과 0으로 초기화가 되어있었습니다.
따라서, climits 헤더파일을 추가하고 minimum을 LLONG_MAX로 초기화했습니다!
#include <iostream>
#include <algorithm>
#include <climits> //LLONG_MAX
using namespace std;
const int MAX = 5000;
int N, idx1, idx2, idx3;
long long minimum;
long long liquid[MAX];
void print3Liquid(void)
{
for (int i = 0; i < N; i++)
{
//양방향에서
int j = i + 1;
int k = N - 1;
while (1)
{
if (j >= k)
break;
long long sum = liquid[i] + liquid[j] + liquid[k];
//최소값 갱신 때마다 idx1~idx3 초기화
if (llabs(sum) < minimum)
{
minimum = llabs(sum);
idx1 = i;
idx2 = j;
idx3 = k;
}
//오름차순 정렬을 했으므로
if (sum < 0)
j++;
else
k--;
}
}
cout << liquid[idx1] << " " << liquid[idx2] << " " << liquid[idx3] << endl;
}
int main(void)
{
cin >> N;
for (int i = 0; i < N; i++)
cin >> liquid[i];
sort(liquid, liquid + N);
minimum = LLONG_MAX;
print3Liquid();
return 0;
}
개발환경:Visual Studio 2017
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
'알고리즘 > BOJ' 카테고리의 다른 글
백준 14921번 용액 합성하기 (0) | 2018.07.08 |
---|---|
백준 2470번 두 용액 (0) | 2018.07.08 |
백준 2563번 색종이 (2) | 2018.07.08 |
백준 2042번 구간 합 구하기 (0) | 2018.07.08 |
백준 1987번 알파벳 (0) | 2018.07.08 |