https://www.acmicpc.net/problem/2470
투포인터 알고리즘을 사용해 start, end 포인트 합의 절댓값이 0에 가까운 포인트를 찾는 문제이다.
처음에는 원소가 모두 음수인 경우, 원소가 모두 양수인 경우, 음수 양수가 섞인 경우를 모두 고려해 start, end 포인트가 배열을 끝까지 돌지 않도록 설계하려 했는데 내용이 너무 복잡해졌다.
그냥 start >= end를 이용해 끝까지 순회해도 통과.
절댓값이 작은 값 변수가 갱신될 경우의 start, end 포인트를 따로 저장해두어 끝까지 돌고 나서 그 저장된 포인트를 출력하는 것이 핵심.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(br.readLine());
int[] arr = new int[N];
st = new StringTokenizer(br.readLine());
for(int i = 0; i < arr.length; i++)
{
arr[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(arr);
int start = 0;
int end = N - 1;
int gap = Integer.MAX_VALUE;
int answer_start = 0;
int answer_end = 0;
int temp;
int sum;
while(start < end)
{
sum = arr[start] + arr[end];
temp = Math.abs(sum);
if(temp < gap)
{
gap = temp;
answer_start = arr[start];
answer_end = arr[end];
}
if(sum > 0)
{
end--;
}
else {
start++;
}
}
System.out.print(answer_start + " " + answer_end );
}
}