PS

Java 1253 좋다

h961014 2023. 9. 11. 22:24

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

 

1253번: 좋다

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

www.acmicpc.net


투포인터로 해결할 수 있는 문제였다.

원소의 배열을 정렬한 뒤 0을 left, n-1을 right로 잡은 뒤 둘의 합이 해당 원소보다 크다면 right - 1, 작다면 left +1을 하여 값을 찾아주는데 여기서 주의할 점은 문제에서 언급되어있듯이 어떤 수가 다른 수 두개의 합이로 나타내어야 하는 조건이 있기에 left, right가 비교하고자 하는 원소와 값이 같은지 다른지 체크를 해주어야한다.


import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        int[] arr = new int[n];
        StringTokenizer st = new StringTokenizer(br.readLine());

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

        Arrays.sort(arr);
        int result = 0;

        for(int i = 0; i < n; i++){
            int left = 0;
            int right = n-1;

            while(true){
                if(i == left){
                    left++;
                }
                if(i == right){
                    right--;
                }
                if(left >= right){
                    break;
                }

                if(arr[left] + arr[right] > arr[i]){
                    right--;
                }else if(arr[left] + arr[right] < arr[i]){
                    left++;
                }else {
                    result++;
                    break;
                }
            }
        }
        System.out.println(result);
    }
}