문제 원본 : https://www.acmicpc.net/problem/2470
2470번: 두 용액
첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -1,000,000,000 이상 1,000,00
www.acmicpc.net
import java.io.*;
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));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
int[] arr = new int[n];
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < n; ++i) {
arr[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(arr);
StringBuilder builder = new StringBuilder();
if (arr[0] > 0) {
builder.append(arr[0]).append(" ").append(arr[1]);
} else if (arr[n - 1] < 0) {
builder.append(arr[n - 2]).append(" ").append(arr[n - 1]);
} else {
int left = 0, right = n - 1, max = Integer.MAX_VALUE;
int[] ans = new int[2];
while (true) {
int tmp = Math.abs(arr[left] + arr[right]);
if (tmp < max) {
ans[0] = arr[left];
ans[1] = arr[right];
max = tmp;
}
if (right - left == 1 || max == 0) {
builder.append(ans[0]).append(" ").append(ans[1]);
break;
}
if (Math.abs(arr[left] + arr[right - 1]) < Math.abs(arr[left + 1] + arr[right])) {
--right;
} else {
++left;
}
}
}
bw.write(builder.toString());
bw.close();
br.close();
}
}
- 정렬과 투 포인터를 활용한 문제
- 모두 양수이거나 모두 음수인 경우를 예외 처리해주었다.
- left를 옮기는 것과 right를 옮기는 것을 비교해 0에 더 가까운 쪽으로 포인터를 옮기면 해결 가능하다.
'알고리즘 > BOJ' 카테고리의 다른 글
| [BOJ] 5721. 사탕 줍기 대회 (0) | 2022.04.07 |
|---|---|
| [BOJ] 1976. 여행 가자 (0) | 2022.04.06 |
| [BOJ] 1715. 카드 정렬하기 (0) | 2022.04.04 |
| [BOJ] 1057. 토너먼트 (0) | 2022.04.03 |
| [BOJ] 9375. 패션왕 신해빈 (0) | 2022.04.02 |