Algorithm/BAEKJOON

[Java] 1253 좋다

곽수진 2023. 4. 12. 16:57
반응형

문제

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