728x90
= 내가 접근한 방법 =
1. 주어진 제한 시간은 1초, n의 범위를 생각하면 2중 for문으로는 분명히 시간 초과 !
따라서 투 포인터 알고리즘 사용
2. 0번째 index 값과, n - 1번째 index값을 비교 합한 후, 절댓값을 씌우고 최솟값을 계속 갱신한다.
최솟값을 갱신하면서 index의 값도 갱신.
= 내가 틀린 이유 =
1. 맨 처음 값과 맨 마지막 값의 합을 비교하면서
1-1. 0보다 클때, end값을 증가
1-2. 0보다 작을 때, start값을 증가
1-3. 0일 때, break;
라는 조건을 생각해야 되는데
절댓값을 씌운 상태에서 이 3가지 조건문을 사용했다.
절댓값이 없는 그냥 순수한 합을 통해서 이 3개의 조건문대로 움직였어야했는데 실수했다.
절댓값을 씌우고 if문이 진행이 되면 무조건 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
53
54
55
56
57
|
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 {
// 1. input
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine()); // 용액의 수 n
int[] arr = new int[n];
// 주어진 제한 시간은 1초, n의 범위는 -1,000,000,000 이상 1,000,000,000 이하
// 2중 for 문을 사용해서 해결하는 문제가 아니라, 투 포인터를 알고리즘 활용
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < n; i++) {
arr[i] = Integer.parseInt(st.nextToken());
} // 용액을 담는 배열
// 최종적으로 0과 가장 가까운 값을 찾는 것이다.
// 2. 맨 왼쪽 값과 맨 오른쪽 값을 비교한다.
// 두 수의 합을 절댓값 씌우고, 최솟값을 계속 갱신하면서 두 수의 값( -98, 99처럼 )도 계속 갱신.
Arrays.sort(arr);
int start = 0;
int end = n - 1;
int min = Integer.MAX_VALUE;
int number = 0; // number 값으로 최솟값을 찾는다
int a = 0; // 두 수 중 하나
int b = 0; // 두 수 중 하나 ( 두 수의 합이 0이랑 가까울 때, 그 때 index 값이 a, b다. )
int check = 0; // check 값으로 index 번호를 조정할 수 있게한다
while (start < end) {
check = arr[start] + arr[end];
number = Math.abs(arr[start] + arr[end]);
if (min > number) {
min = number;
a = arr[start];
b = arr[end];
}
if (check > 0) {
end--;
} else if (check < 0) {
start++;
} else if (check == 0) {
break;
}
}
System.out.println(a + " " + b);
}
}
|
cs |
728x90
'백준 오답노트 > 투 포인터' 카테고리의 다른 글
백준 - 투 포인터 1644번 소수의 연속함 / 문제풀이, 오답노트, 에라토스테네스의 체 알고리즘 (0) | 2023.01.08 |
---|---|
백준 - 투 포인터 1450 냅색 문제 / 문제풀이, 오답 (0) | 2023.01.04 |
백준 - 이분 탐색 1920 수 찾기 문제 / 문제풀이, 알고리즘 복습 (0) | 2023.01.03 |
백준 - 투 포인터 1806번 부분합 / 문제풀이, 오답노트 (0) | 2022.12.28 |
백준 - 투 포인터 3273번 두 수의 합 / 틀린 이유, 해결 방법 ( 알고리즘 ) (0) | 2022.12.24 |