문제의 입력 조건에 오름차 순으로 입력되므로, 범위를 줄여가면서 탐색할 수 있다.
또한 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;
}
'알고리즘 관련 > BOJ' 카테고리의 다른 글
14891 톱니바퀴 (0) | 2021.03.08 |
---|---|
1806 부분합 (0) | 2021.01.28 |
17404 RGB거리 2 (0) | 2021.01.22 |
12852 1로 만들기 2 (0) | 2021.01.13 |
2225 합분해 (0) | 2021.01.11 |