
N개의 입력 받은 수를 하나씩 순회하며 해당 수가 다른 수 두 개의 합으로 나타내면 좋은 수 -> 그 좋은 수가 몇 개인지 찾는 문제
이것 역시 투포인터를 이용해 풀 수 있다.
판별의 대상이 되는 수를 K라고 했을 때 K가 N이 될 때까지 하나씩 옮겨가며 더했을 때 K가 되는 수가 있는지 찾기 있는지 찾기
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class 좋다 {
public static void main(String[] args) throws IOException{
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
//수의 개수 N 입력받기
int N = Integer.parseInt(bf.readLine());
int[] nums = new int[N];
StringTokenizer st = new StringTokenizer(bf.readLine());
int K;
int result = 0;
//N개의 수 입력받기
for (int i=0; i<N; i++) {
nums[i] = Integer.parseInt(st.nextToken());
}
//배열 오름차순 정렬
Arrays.sort(nums);
//판별 대상이 되는 수
for (int i=0; i<N; i++) {
K = nums[i];
int start = 0;
int end = N-1;
//왼쪽 포인터가 오른쪽 포인터보다 작을 때까지지
while (start < end) {
//자기 자신을 더하지 않기 위해
if (start == i) {
start++;
continue;
}
if (end == i) {
end--;
continue;
}
//두 값의 합이 판별 대상의 수 보다 작다면 start 포인터 오른쪽으로 이동
if (nums[start] + nums[end] < K) {
start++;
}
//두 값의 합이 판별 대상의 수 보다 크다면 end 포인터 왼쪽으로 이동
else if (nums[start] + nums[end] > K) {
end--;
}
//같으면 좋은수이므로 하나 올려주기
else {
result++;
break; //이미 좋은 수인게 확정 되었으므로 중복으로 카운트 하는 것 방지
}
}
}
System.out.println(result);
}
}