https://www.acmicpc.net/problem/2470
[풀이]
- 이분 탐색 유형의 문제였습니다.
- 최소값을 얻어야 하기 때문에 시작 인덱스와 끝의 인덱스의 배열 값을 더한 값과 초기 값을 비교하는 과정을 반복했습니다.
- 만약 이전값보다 최소값일 경우에는, 그 시점의 start,end 변수 값을 answer1,answer2 변수에 담았습니다.
- while 반복문이 끝날 경우 마지막에 담긴 answer1,answer2 변수값을 이용해서 답을 출력합니다.
[코드]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
static int N, start, end, answer1, answer2;
static int[] arr;
public static void solve(int start, int end) {
int minValue = Integer.MAX_VALUE;
while (start < end) {
int rawMid = arr[start] + arr[end];
int mid = Math.abs(rawMid);
if (minValue > mid) {
minValue = mid;
answer1 = start;
answer2 = end;
}
if (rawMid < 0)
start += 1;
else
end -= 1;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
arr = new int[N];
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
for (int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
start = 0;
end = arr.length - 1;
Arrays.sort(arr);
solve(start, end);
System.out.println(arr[answer1] + " " + arr[answer2]);
}
}
'Algorithm > 백준' 카테고리의 다른 글
백준 17413번 : 단어 뒤집기 2(Java) (0) | 2021.09.10 |
---|---|
백준 1654번 : 랜선 자르기(Java) (0) | 2021.09.10 |
백준 10809번 : 알파벳 찾기(Java) (0) | 2021.09.06 |
백준 15787번 : 기차가 어둠을 헤치고 은하수를(Java) (0) | 2021.09.06 |
백준 1940번 : 주몽(Java) (0) | 2021.09.05 |