투포인터 문제입니다.
N개의 수가 있을 때 좋은 수의 개수를 찾아야합니다.
좋은 수는 해당 수를 제외한 2개의 수의 합으로 만들어질 경우 좋은 수라고 합니다.
입력받은 수의 배열을 정렬해줍니다.
for문을 통해서 차례대로 좋은수인지 체크합니다.
투포인터로 두 개의 합을 구하고 값이 클 경우 right -1, 값이 작을 경우 left + 1 을 해줍니다.
만약 두 개의 값이 같은 경우 찾는 수와 인덱스가 같은지 확인해주고 둘 다 다를 경우 좋은 수로 카운팅해줍니다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
int[] arr = new int[n];
int index = 0;
int result = 0;
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < n; ++i) {
arr[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(arr);
for (int i = 0; i < n; ++i) {
int findNum = arr[i];
int left = 0;
int right = n - 1;
int sum = 0;
while (left < right) {
sum = arr[left] + arr[right];
if (sum == findNum) {
if (i == left) {
++left;
} else if (right == i) {
--right;
} else {
++result;
break;
}
}
if (arr[left] + arr[right] > findNum) {
--right;
} else if (arr[left] + arr[right] < findNum) {
++left;
}
}
}
bw.write(result + "\n");
bw.close();
}
}
'알고리즘' 카테고리의 다른 글
[Java] 백준 9663번 N-Queen (0) | 2023.07.04 |
---|---|
[Java] 백준 1013번 Contact (0) | 2023.07.03 |
[Java] 백준 2310번 어드벤처 게임 (0) | 2023.07.01 |
[Java] 백준 1043번 거짓말 (0) | 2023.06.30 |
[Java] 백준 2225번 합분해 (0) | 2023.06.29 |