Coding Test

백준 좋다(1253)

댕발바닥 2024. 3. 28. 20:52

이분 탐색 문제를 풀어보았다.

 

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

 

1253번: 좋다

첫째 줄에는 수의 개수 N(1 ≤ N ≤ 2,000), 두 번째 줄에는 i번째 수를 나타내는 Ai가 N개 주어진다. (|Ai| ≤ 1,000,000,000, Ai는 정수)

www.acmicpc.net

 

투포인터로 문제를 해결 할 수 있었다.

 

정렬된 수를 가지고 선택한 수를 투포인트 진행하며 가능여부를 체크하면된다.

 


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

public class Main {

    public static void main(String[] args) throws IOException {
        solution();
    }


    public static void solution() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int N = Integer.parseInt(st.nextToken());

        HashMap<Long, Boolean> visited =  new HashMap<>();

        long[] nums = new long[N];
        int answer= 0;

        st = new StringTokenizer(br.readLine());

        for (int i=0; i < N; i++) {
            nums[i] = Integer.parseInt(st.nextToken());
        }

        Arrays.sort(nums);

        for (int i=0 ; i < N; i++) {

            long num = nums[i];

            int left = 0;
            int right = N-1;

            while (left < right) {

                if (left == i) {
                    left++;
                    continue;
                } else if (right == i) {
                    right--;
                    continue;
                }

                long sum = nums[left] + nums[right];

                if (sum == num) {
                    answer++;
                    break;
                } else if (sum > num) {
                    right--;
                } else {
                    left++;
                }

            }


        }

        System.out.println(answer);
    }


}

 

 

결과