본문 바로가기

코딩테스트/백준

[백준-자바] 1253번 좋다 / 2022.05.23

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.*;

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());
        StringTokenizer st = new StringTokenizer(br.readLine());
        int [] num = new int[N]; // 수를 저장할 배열

        for(int i=0; i<N; i++){ // 수 입력
            num[i] = Integer.parseInt(st.nextToken());
        }

        Arrays.sort(num); // 수 정렬
        int count = 0; // 좋은 수의 개수
        for(int index=0; index<N; index++){
            int find = num[index]; // 내가 찾는 값
            int i = 0; // 두 개의 포인터 사용
            int j = N-1; // i는 맨 처음부터 j는 마지막 배열부터
            while(i<j){ // i가 j보다 이전 배열 일때까지 반복
                if(num[i]+num[j]==find){ // 두 개의 포인터의 합이 내가 찾는 값과 일치할 때
                    if(i!=index&&j!=index){ // 두 개의 배열 인덱스가 찾고자 하는 배열 인덱스와는 달라야 함
                        count++; // 좋은 수 + 1
                        break; // 다음 배열(index+1)로 이동
                    } else if(i==index){ // i값이 index값과 같다면 i + 1
                        i++;
                    } else if(j==index){ // j값이 index값과 같다면 j - 1
                        j--;
                    }
                } else if(num[i]+num[j]<find){ // 두 개의 포인터의 합이 내가 찾는 값보다 작을 때
                    i++; // 더 큰 수로 포인터 이동
                } else { // 두 개의 포인터의 합이 내가 찾는 값보다 클 때
                    j--; // 더 작은 수로 포인터 이동
                }
            }
        }
        System.out.println(count); // 좋은 수의 개수
    }
}

 

풀이 :