문제 개요
오늘의 코딩 테스트 문제는 백준 2467번 '용액'이다. 산성과 알칼리성 용액을 섞어 특성값 0에 가장 가까운 용액을 만드는 문제다.
문제 분석
•
N개의 용액 (-10^9 ≤ 특성값 ≤ 10^9)
•
입력: 오름차순 정렬된 특성값
•
출력: 합이 0에 가장 가까운 두 용액의 특성값
핵심은 정렬된 배열에서 두 수의 합이 특정 값(0)에 가장 가까운 쌍을 찾는 것.
접근 방식
투 포인터 알고리즘을 사용했다. 양 끝에서 시작해 합이 0에 가까워지는 방향으로 포인터를 이동시키는 방식이다.
코드
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int N;
cin >> N;
vector<int> vec(N);
for (int i = 0; i < N; i++)
cin >> vec[i];
int s=0, t=N-1;
int min_value = 2'000'000'000;
int index1, index2;
while(s<t)
{
if (abs(vec[s]+vec[t])<min_value)
{
min_value = abs(vec[s]+vec[t]);
index1 = s;
index2 = t;
}
if (abs(vec[s+1]+vec[t]) < abs(vec[s]+vec[t-1]))
s++;
else
t--;
}
cout << vec[index1] << ' ' << vec[index2] << endl;
return 0;
}
C++
복사
주요 로직:
1.
양 끝에 포인터 위치
2.
두 포인터 값의 합 계산
3.
최소값 갱신
4.
다음 단계의 합이 더 0에 가까워지는 방향으로 포인터 이동
5.
포인터가 교차할 때까지 2-4 반복
회고
이 문제가 왜 골드 레벨인지 의문이다. 정렬된 배열이 주어지고, 두 수의 합을 구하는 전형적인 투 포인터 문제다.