[백준 2470] 두 용액
카테고리: BOJ
난이도
골드 V
📜문제
틀린 풀이 ❌
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int N = 0;
cin >> N;
vector<int> v(N);
for (int i = 0; i < N; i++)
{
cin >> v[i];
}
sort(v.begin(), v.end());
int start = 0, end = v.size() - 1;
int min = 2000000000;
vector<int> result(2);
while (start < end)
{
if (v[start] + v[end] < 0)
{
if (abs(v[start] + v[end]) < min)
{
min = abs(v[start] + v[end]);
result[0] = v[start];
result[1] = v[end];
}
start++;
}
else if (v[start] + v[end] > 0)
{
if ((v[start] + v[end]) < min)
{
min = v[start] + v[end];
result[0] = v[start];
result[1] = v[end];
}
end--;
}
else break;
}
cout << result[0] << " " << result[1] << "\n";
return 0;
}
v[start] + v[end] 가 0일 경우 break한다고 생각했는데 이렇게 됐을 때 result의 값이 최신화가 안된다는 것을 인지하지 못했다.
맞은 풀이 ⭕
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int N = 0;
cin >> N;
vector<int> v(N);
for (int i = 0; i < N; i++)
{
cin >> v[i];
}
sort(v.begin(), v.end());
int start = 0, end = v.size() - 1;
int min = 2000000000; // input으로 나올 수 없는 최대값 설정
vector<int> result(2);
while (start < end)
{
if (abs(v[start] + v[end]) < min) // 절대값이 min 보다 작을 경우
{
min = abs(v[start] + v[end]);
result[0] = v[start];
result[1] = v[end];
if (v[start] + v[end] == 0) break;
}
if (v[start] + v[end] < 0) start++;
else if (v[start] + v[end] > 0) end--;
}
cout << result[0] << " " << result[1] << "\n";
return 0;
}
틀린 풀이에서 나눈 if문에서 모두 result의 최신화가 일어나서 하나의 코드로 묶어주고 계산했다.
댓글남기기