백준 1940
백준 1940 문제
import java.util.*;
public class Boj1940 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int[] arr = new int[n];
int i = 0;
int j = arr.length - 1;
int count = 0;
for (int k = 0; k < n; k++) {
arr[k] = sc.nextInt();
}
Arrays.sort(arr);
while (i < j) {
int sum = arr[i] + arr[j];
if (sum == m) {
count ++;
i++;
j--;
} else if (sum > m) {
j--;
} else {
i++;
}
}
System.out.println(count);
}
}
풀이
- 배열의 값이 유니크하고, 사용된 값은 더 이상 사용하지 못한다면, 배열의 양 끝에 포인터를 두는 투포인터 알고리즘을 사용할 수 있다.
- 투포인터 알고리즘은 O(n)의 시간 복잡도를 갖지만, 정렬이 필요하기에 정렬할 값들의 O(n log n)의 값을 확인한다.
- 재료의 수와 고유 번호의 합을 각각
n과 m 변수로 선언한다.
- 고유 번호를 담을 배열을
n만큼 선언한다.
- 배열 맨 앞에 위치할 첫 번째 포인터
i와 배열 맨 뒤에 위치할 두 번째 포인터 j를 각각 0과 n-1로 할당한다.
- 만들어진 갑옷의 수를
count 변수에 담는다.