코딩테스트/백준

백준 1253번 좋은 수

wn1331 2023. 1. 18. 23:08
반응형

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

 

1253번: 좋다

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

www.acmicpc.net

 

 

2 초 256 MB 17769 4399 3165 23.851%

문제

N개의 수 중에서 어떤 수가 다른 수 두 개의 합으로 나타낼 수 있다면 그 수를 “좋다(GOOD)”고 한다.

N개의 수가 주어지면 그 중에서 좋은 수의 개수는 몇 개인지 출력하라.

수의 위치가 다르면 값이 같아도 다른 수이다.

입력

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

출력

좋은 수의 개수를 첫 번째 줄에 출력한다.

예제 입력 1 복사

10
1 2 3 4 5 6 7 8 9 10

예제 출력 1 복사

8

힌트

3,4,5,6,7,8,9,10은 좋다.

출처

 

양 끝점에서부터 포인터를 이용해 좋은 수를 찾아내는 알고리즘이다.

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

public class Main {
    public static void main(String[] args) throws NumberFormatException, IOException {
        //좋은 수 구하기
        //주어진 N개의 수에서 다른 두 수의 합으로 표현되는 수가 있다면 그 수를 '좋은 수'라고 한다. N개의 수 중 좋은 수가 총 몇개인지 출력하시오.
        int answer = 0;
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(bf.readLine());
        Long[] arr = new Long[N];
        StringTokenizer st = new StringTokenizer(bf.readLine());
        for(int i = 0; i<N;i++) arr[i] = Long.parseLong(st.nextToken());
        Arrays.sort(arr);
        for(int k = 0;k<N;k++){
            long This = arr[k];
            int left = 0;
            int right = N-1;
            while(left<right){
                if(arr[left]+arr[right]==This){
                    if(left!=k&&right!=k){
                        answer++;
                        break;
                    }
                    else if(left==k)left++;
                    else if(right==k)right--;
                }
                else if (arr[left]+arr[right]<This) {
                    left++;
                }
                else {
                    right--;
                }
            }
        }
        System.out.println(answer);
    }

}
반응형