알고리즘

bj 1253 좋다(투 포인터)

쥐4 2024. 12. 2. 15:42

https://www.acmicpc.net/problem/1253

 

N개의 수가 주어졌을 때, 두 개의 수의 합으로 만들어질 수 있는 수를 센다.

 

N이 2000이기 때문에 완전 탐색을 하면, 시간 초과가 난다. 2000*1999*1998

즉, 2000*1999(두개의 수의 합을 구하는 부분)을 최적화 해주면 될 것이라 생각했다.

 

투 포인터로 O(N)을 만들어 2000 * 1999로 만들 수 있다.

투 포인터는 탐색을 위한 접근법이고,

이분 탐색은 탐색 그 자체이다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
    static int N;
    static int[] arr;
    static boolean[] checked;
    static BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
    static StringTokenizer stringTokenizer;
    public static void main(String[] args) throws IOException {
        N = Integer.parseInt(bufferedReader.readLine());
        arr = new int[N];
        checked = new boolean[N];

        String str = bufferedReader.readLine();
        stringTokenizer = new StringTokenizer(str);
        for(int i = 0; i < N; i++){
            arr[i] = Integer.parseInt(stringTokenizer.nextToken());
        }
        Arrays.sort(arr);

        int cnt = 0;
        for(int i = 0; i < N; i++){
            int start = 0;
            int end = arr.length-1;
            while(true) {
                if (start == i) {
                    start++;
                } else if (end == i) {
                    end--;
                }

                if (start >= end) break;

                if (arr[start] + arr[end] > arr[i]) {
                    end--;
                } else if (arr[start] + arr[end] < arr[i]) {
                    start++;
                } else {
                    cnt++;
                    break;
                }
            }
        }
        System.out.println(cnt);
    }
}