간단한 투포인터 문제
리스트의 첫번째 원소을 가르키는 포인터 i와
리스트의 마지막 원소를 가르키는 포인터 j를 준비한다.
이후 (list[i] + list[j])의 절대값과 기존 최솟값을 비교 후
값이 작다면 두 포인터의 값을 저장한다.
포인터의 이동 알고리즘은 다음과 같다.
list[i] + list[j] = 양수일 경우 => j - 1
list[i] + list[j] = 음수일 경우 => i + 1
합이 양수일 경우 더 작은 값을 더해야 하고
합이 음수일 경우 더 큰 값을 더해봐야 하기에 저런 방식으로 이동하면 된다.
#include<stdio.h>
int list[100000], res1, res2, min = 2000000001;
int main() {
int N, sum = 0, i = 0, j;
scanf("%d",&N);
for (int i = 0; i < N; i++)scanf("%d",&list[i]);
j = N - 1;
while (i < j) {
sum = list[i] + list[j];
if (min > ((sum > 0)? sum : -sum)) {
res1 = i;
res2 = j;
min = ((sum > 0) ? sum : -sum);
}
if (sum >= 0)j--;
else i++;
}
printf("%d %d",list[res1],list[res2]);
return 0;
}