import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
long[] arr = new long[n];
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i=0; i<n; i++) {
arr[i] = Long.parseLong(st.nextToken());
}
// left는 0번 right는 n-1번 인덱스 시작
int left =0;
int right =n-1;
// 0에 제일 근접했던 start, end 인덱스 기록용 변수
int ml =0, mr = 0;
long min = Long.MAX_VALUE;
while(left<right) {
long sum = arr[left]+arr[right];
if(min > Math.abs(sum)) {
min = Math.abs(sum);
ml = left; mr = right;
}
if(sum>=0) {
right--;
}else {
left++;
}
}
System.out.println(arr[ml] +" "+arr[mr]);
}
}
얻어갈 점:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int n;
static long[] arr;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
arr = new long[n];
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i=0; i<n; i++) {
arr[i] = Long.parseLong(st.nextToken());
}
long min = Long.MAX_VALUE;
int ml =0, mr = 0;
// i가 0일때부터 순차적으로 증가하며 기준이 됨
for(int i=0; i<n-1; i++) {
int left =i+1;
int right =n-1;
while(left<=right) {
//기준이 되는 i를 제외한 left 와 right의 중간 지점 찾기
int mid = (left+right)/2;
long sum = Math.abs(arr[i]+arr[mid]);
//최소값 발견시 해당 좌우 인덱스와 최소값 기록
if(min > sum) {
min = sum;
ml = i; mr = mid;
}
if(arr[mid]>= -arr[i]) {
right = mid-1;
}else{
left = mid+1;
}
}
}
System.out.println(arr[ml]+" "+arr[mr]);
}
}
얻어갈 점: