
알고리즘 분류 : 투 포인터
난이도 : 골드5
출처 : 백준 - 두 수의 합



투포인터 방식으로 문제를 해결한다.
두 수의 합과 K와의 차이가 최소가 되는 숫자 쌍의 갯수를 구하는 문제이다.
입력받은 배열을 정렬하고 마지막 숫자와 끝 숫자를 비교한다.
이때 최소 차이 숫자를 저장하고 최소 차이숫자와 비교하면서 투포인터를 진행한다.
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
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 p1 = 0, p2 = n-1;
int cnt=0, minGap=Integer.MAX_VALUE;
while(p1<p2) {
if(Math.abs(arr[p1]+arr[p2]-K)==minGap) {
cnt++;
}
else if(Math.abs(arr[p1]+arr[p2]-K)<minGap) {
minGap = Math.abs(arr[p1]+arr[p2]-K);
cnt=1;
}
if(arr[p1]+arr[p2]<K)
p1++;
else if(arr[p1]+arr[p2]>K)
p2--;
else {
p1++;
p2--;
}
}
sb.append(cnt).append("\n");
}
System.out.println(sb);
}
}

문제를 잘 안읽고 풀어서 그냥 두수의 합이 K인 숫자쌍으로 구현을 했었다. 문제를 잘 읽자