์ซ์ ํ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ์ผ๊ณ , ๋๋จธ์ง ์ซ์๋ค ๊ฐ์ด๋ฐ ๊ธฐ์ค์ผ๋ก ์ผ์ ์ซ์์ ๋ํ์ ๋ ๊ฐ์ฅ 0์ ๊ฐ๊น์ธ ์ ์๋ ์ซ์๊ฐ ๋ฌด์์ธ์ง ์ฐพ๋ ๋ฐฉ๋ฒ์ ์๊ฐํ๋ค. ์ฃผ์ด์ง๋ ์ซ์๋ 10๋ง๊ฐ์ด๊ณ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ๋ก ์ฃผ์ด์ง๋ค. 10๋ง๊ฐ์ ์ซ์์ ๋ํด ํ๋ฒ์ฉ ๊ธฐ์ค ์ซ์๋ก ์ ํ๊ณ , ๊ธฐ์ค ์ซ์์ ์ค๋ฅธ์ชฝ์ ์๋ ์ซ์๋ถํฐ ๋ง์ง๋ง๊น์ง ์ซ์๋ค ๊ฐ์ด๋ฐ ํฉ์ด 0์ ๊ฐ๊น์ด ์ซ์ ์กฐํฉ์ ์ฐพ์ผ๋ฉด ๋๋ค. ์ ๋ ฌ๋์ด์๊ธฐ ๋๋ฌธ์ ๊ฐ์ ์ฐพ๋ ๊ณผ์ ์ ์ด๋ถํ์์ผ๋ก ์ํํ๋ค.
๋ฌธ์ ์ ์ฃผ์ด์ง๋ ํ ์คํธ์ผ์ด์ค๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๋ฉด ์์ ๊ฐ์ด ์ฐพ์ ์ ์๋ค. -99, -2, -1, 4๊ฐ ๋ชจ๋ ํ ๋ฒ์ฉ ๊ธฐ์ค ์ซ์๊ฐ ๋ ์ ์๋ค. ํด๋น ๊ธฐ์ค ์ซ์์ ์ค๋ฅธ์ชฝ์ ๋ํด์๋ง ํ์์ ์งํํ๋๋ฐ ์ผ์ชฝ ๋ฒ์์ ์ซ์๋ ์ด๋ฏธ ํด๋น ์ซ์๋ค์ด ๊ธฐ์ค ์ซ์์ผ ๋ ํ์์ ๋๋์ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๊ตณ์ด ๋ ๋ฒ ์งํํ ํ์๋ ์๋ค. ๋ง์ง๋ง ์ซ์์ธ 98์ ํด๋น ์ซ์์ ์ค๋ฅธ์ชฝ์ ์ซ์๊ฐ ์์ผ๋ฏ๋ก ํ์์ ์งํํ์ง ์๋๋ค.
์ฒ์์๋ 0์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ซ์๋ฅผ ๋ง์ง๋ง๊น์ง ์ฐพ์๋ด๋ ๋ฐฉ์์ผ๋ก ํ์์ ์งํํ์ง๋ง, ๋ง์ง๋ง์ ํ์๋๋ ์ซ์๊ฐ ํญ์ 0๊ณผ ๊ฐ์ฅ ๊ฐ๊น์ด ํฉ์ ๊ฐ์ง๋ ์๋๋ค. ๋๋ฌธ์ ํ์ ๋์ค์ ํฉ์ด 0๊ณผ ๊ฐ๊น์ด ๊ฐ์ด ๋์ค๊ฒ ๋๋ฉด answer
๋ฐฐ์ด์ ๊ฐ์ ์
๋ฐ์ดํธํ๊ณ ํ์์ ์งํํ๋ค. ์๋ ํ
์คํธ์ผ์ด์ค์์ -2๊ฐ ๊ธฐ์ค์ผ ๋ -1์ด 0๊ณผ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ฐ์ ๊ฐ๊ฒ ๋๋๋ฐ ์ด๋ถ ํ์์ ๋๊น์ง ์งํํ๊ธฐ๋ง ํ๋ฉด 103 ์์ ์ข
๋ฃ๋๊ธฐ ๋๋ฌธ์ ์ค๋ต์ด ๋๋ค. ํ์ง๋ง ๋์ค์ ๊ฐ์ ๊ณ์ ์
๋ฐ์ดํธํ๋ฉด -1์ด ์ ์ฅ๋๊ณ ์ข
๋ฃ๋๋ค ์ด ๋ฐฉ์์ ์ด๋ถํ์์ด๋ค.
4
-100 -2 -1 103
import java.util.Arrays;
import java.util.Scanner;
public class Main {
static int N;
static long[] values;
static long[] binarySearch(long stdNum, int left) {
int right = N-1;
int mid = (left + right) / 2;
long sum;
long[] answer = new long[] {2_000_000_000, stdNum, values[N-1]};
while (left <= right) {
mid = (left + right) / 2;
sum = stdNum + values[mid];
if (Math.abs(sum) < answer[0]) {
answer[0] = Math.abs(sum);
answer[2] = values[mid];
}
if (sum >= 0) {
right = mid - 1;
} else {
left = mid + 1;
}
}
return answer;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
values = new long[N];
for (int i = 0; i < N; i++) {
values[i] = sc.nextLong();
}
long[] answer = new long[] {2_000_000_000, 0, 0};
long[] tmp;
for (int i = 0; i < N-1; i++) {
tmp = binarySearch(values[i], i+1);
if (tmp[0] <= answer[0]) {
answer = tmp;
}
}
System.out.println(answer[1] + " " + answer[2]);
}
}
์ค๋ฆ์ฐจ์ ์ ๋ ฌ ์ํ์ด๋ฏ๋ก ๊ฐ์ฅ ์ผ์ชฝ ๊ฐ์ startIdx
๊ฐ์ฅ ์ค๋ฅธ์ชฝ ๊ฐ์ endIdx
๋ก ๋๊ณ ๋ ์ธ๋ฑ์ค๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ์ ํฉ์ด 0์ ๊ฐ๊น์ด์ง ์ฌ๋ถ๋ฅผ ํ๋จํ๋ค. ๋ง์ฝ ํ์ฌ ์ ์ฅ๋ ๊ฐ๋ณด๋ค 0์ ๋ ๊ฐ๊น์ด ๊ฐ์ด๋ผ๋ฉด ์
๋ฐ์ดํธ ํ๋ค.
startIdx
๋ฅผ ์ฆ๊ฐ์ํค๋ฉด ๋ํ๋ ๊ฐ์ ์ฆ๊ฐ์ํค๋ ๊ฒ์ด๊ณ , endIdx
๋ ๋ํ๋ ๊ฐ์ ๊ฐ์์ํค๋ ๊ฒ์ด๋ค. ๋ง์ฝ ๋ ๊ฐ์ ๋ํ ํฉ์ด 0๋ณด๋ค ์๋ค๋ฉด startIdx
๋ฅผ ์ฆ๊ฐ์ํค๋ฉด ํฉ์ด 0์ ๊ฐ๊น์์ง ํ๋ฅ ์ด ๋์์ง๊ณ , 0๋ณด๋ค ํฌ๋ค๋ฉด endIdx
๋ฅผ ๊ฐ์์ํค๋ฉด ํฉ์ด 0์ ๊ฐ๊น์์ง ํ๋ฅ ์ด ๋์์ง๋ค.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
import java.util.StringTokenizer;
public class Main {
static int N;
static long[] values;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
values = new long[N];
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
values[i] = Long.parseLong(st.nextToken());
}
long minValue = Long.MAX_VALUE;
int startIdx = 0;
int endIdx = N-1;
long sum;
int left = 0;
int right = N-1;
while (startIdx < endIdx) {
sum = values[startIdx] + values[endIdx];
if (Math.abs(sum) < minValue) {
minValue = Math.abs(sum);
left = startIdx;
right = endIdx;
}
if (sum < 0) {
startIdx++;
} else {
endIdx--;
}
}
System.out.println(values[left] + " " + values[right]);
}
}