투포인터를 이용해서 풀었고 거리 비교는 절댓값으로 계산해야하므로 Math.abs()
를 사용했다.
처음에는 서로 다른 정수
로 구성된 배열이 주어진다는 조건을 보지 못해서 조건 분기가 굉장히 복잡했다.
이 조건으로 인해
if (sum == k) {
left++;
right--;
}
라는 구문이 가능해졌고 조건 분기가 상당히 깔끔해졌다.
조건을 꼼꼼하게 읽는 습관을 들이자.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int t = Integer.parseInt(br.readLine());
while (t-- > 0) {
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int k = Integer.parseInt(st.nextToken());
int[] arr = new int[n];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < n; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(arr);
int left = 0;
int right = arr.length - 1;
int best = (int)(2 * 10e8);
int count = 1;
while (true) {
int sum = arr[left] + arr[right];
if (Math.abs(sum - k) == best) {
count++;
} else if (Math.abs(sum - k) < best) {
count = 1;
best = Math.abs(sum - k);
}
if (sum == k) {
left++;
right--;
} else if (sum < k) {
left++;
} else {
right--;
}
if (left >= right) {
break;
}
}
System.out.println(count);
}
}
}