알고리즘 관련/BOJ
2467 용액
Andrew-Yun
2021. 1. 22. 14:11
문제의 입력 조건에 오름차 순으로 입력되므로, 범위를 줄여가면서 탐색할 수 있다.
또한 N이 10^5이기 때문에 완전탐색을 사용하면 시간초과가 난다.
합이 0에 가장 가까운 두 개의 수를 찾는 문제이기 때문에 합이 음수라면, 왼쪽의 범위를 축소하고 합이 양수라면 오른쪽의 범위를 축소하면서 인덱스를 저장한다.
더보기
정답코드
#include <iostream>
using namespace std;
#define MAX_SIZE 100000
int N;
int arr[MAX_SIZE];
int main()
{
scanf("%d", &N);
for (int i = 0; i < N; i++)
scanf("%d", &arr[i]);
int start = 0, end = N - 1;
long long sum = arr[start] + arr[end];
long long minimum = abs(sum) + 1;
int idx1, idx2;
while (start < end) {
sum = arr[start] + arr[end];
if (abs(sum) < minimum) {
minimum = abs(sum);
idx1 = start;
idx2 = end;
}
if (sum < 0)
start++;
else
end--;
}
printf("%d %d\n", arr[idx1], arr[idx2]);
return 0;
}