import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Inet4Address;
import java.util.*;
import static java.util.Collections.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int M = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
int[] ingre = new int[N];
for (int i = 0 ; i < N;i++)
{
ingre[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(ingre);
int start = 0;
int end= N-1;
int count = 0;
int total = 0;
while(start < end)
{
total = ingre[start]+ingre[end];
if (total > M)
{
end--;
}
else if (total == M)
{
count++;
end--;
start++;
}
else{
start++;
}
}
System.out.println(count);
}
}
입력받은 배열을 오름차순으로 정렬 후 투 포인터를 이용한다. 투 포인터는 시작지점을 맨 앞 끝나는 지점을 맨 뒤로 정한 후 끝에서부터 하나씩 줄어들다가 값이 구하려는 값보다 작아지면 시작지점을 1씩 증가하는 방향으로 구하는 문제이다. 맨 처음에 브루트 포스로 구할려고 했지만 시간초과가 발생하여 결국에는 투 포인터로 구하였다.