
알고리즘 분류 : 투포인터, 그리디
난이도 : 실버1
출처 : 백준 - 현대모비스 소프트웨어 아카데미


사이즈가 N인 배열에 능력치를 입력 받은 후 오름차순으로 정렬한다.
s와 e에 각각 0, N-1을 넣고 s번째 값과 e번째 값의 합이 M보다 크거나 같으면 cnt+1, s+1, e-1를 한다.
작다면 s+1을 한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine(), " ");
Integer[] arr = new Integer[N];
for(int i=0;i<N;i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(arr);
int s = 0, e = N-1, cnt=0;
while(s<e) {
if(arr[s]+arr[e]>=M) {
cnt++;
s++;
e--;
}
else {
s++;
}
}
System.out.println(cnt);
}
}

그리디와 투포인터를 섞은 문제다. s인덱스와 e인덱스 값의 변화를 잘 고려해야한다.