문제
N개의 수 중에서 어떤 수가 다른 수 두 개의 합으로 나타낼 수 있다면 그 수를 “좋다(GOOD)”고 한다.
N개의 수가 주어지면 그 중에서 좋은 수의 개수는 몇 개인지 출력하라.
수의 위치가 다르면 값이 같아도 다른 수이다.
입력
첫째 줄에는 수의 개수 N(1 ≤ N ≤ 2,000), 두 번째 줄에는 i번째 수를 나타내는 Ai가 N개 주어진다. (|Ai| ≤ 1,000,000,000, Ai는 정수)
출력
좋은 수의 개수를 첫 번째 줄에 출력한다
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args) throws NumberFormatException, IOException{
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
int Num = Integer.parseInt(bufferedReader.readLine());
int result = 0;
long arr[] = new long[Num];
StringTokenizer stringTokenizer = new StringTokenizer(bufferedReader.readLine());
for(int i=0; i<Num; i++){
arr[i] = Long.parseLong(stringTokenizer.nextToken());
}
Arrays.sort(arr);
for(int k=0; k<Num; k++){
long find = arr[k];
int i=0;
int j=Num-1;
while(i<j){
if(arr[i] + arr[j] == find){
if(i != k && j != k){
result++;
break;
}
else if(i == k){
i++;
}
else if(j == k){
j--;
}
}
else if(arr[i] + arr[j] < find){
i++;
}
else{
j--;
}
}
}
System.out.println(result);
bufferedReader.close();
}
}
▶ int Num = Integer.parseInt(bufferedReader.readLine()) : 수의 개수를 Integer 형으로 입력 받아 Num 변수에 저장함
▶ long arr[] = new long[Num] : 입력 받은 Num의 크기를 가진 배열 arr를 생성함
▶ for(int i=0; i<Num; i++){ arr[i] = Long.parseLong(stringTokenizer.nextToken()) } : Num만큼 반복문을 돌리며 Long 크기의 값을 하나씩 입력받아 arr 배열에 값으로 저장함
▶ Arrays.sort(arr) : arr 배열을 오름차순으로 정렬함
▶ long find = arr[k] : Num만큼 반복문을 돌리며 find의 값을 0부터 시작해 Num까지 지정함
▶ int i=0; int j=Num-1 : 투 포인터를 각각 i와 j로 지정 후 i는 0부터 시작하고 j는 배열의 크기인 Num보다 1 작은 값으로 초기화 함
while(i<j){
if(arr[i] + arr[j] == find){
if(i != k && j != k){
result++;
break;
}
else if(i == k){
i++;
}
else if(j == k){
j--;
}
}
else if(arr[i] + arr[j] < find){
i++;
}
else{
j--;
}
}
▶ i가 j보다 작은 경우 반복문을 돌림
▶ 배열의 i 인덱스 값과 j 인덱스 값을 더한 값이 find와 같은 경우
→ 두 포인터 i와 j가 모두 k와 다른 경우 result값을 하나 더하고 반복문을 종료함
→ i와 k가 같은 경우 i 값을 하나 더함
→ j와 k가 같은 경우 j 값을 하나 뺌
▶ 배열의 i 인덱스 값과 j 인덱스 값을 더한 값이 find보다 작은 경우 포인터 i 증가
▶ 앞의 두 경우 모두 해당하지 않을 때는 포인터 j 감소
'Algorithm > BAEKJOON' 카테고리의 다른 글
[Java] 11003 최솟값 찾기 (0) | 2023.04.14 |
---|---|
[Java] 12891 DNA 비밀번호 (0) | 2023.04.13 |
[Java] 1940 주몽 (0) | 2023.04.10 |
[Java] 2018 수들의 합 5 (0) | 2023.04.09 |
[Java] 10986 나머지 합 (0) | 2023.04.08 |