본문 바로가기
알고리즘 풀이/백준

[Gold IV] 좋다 - 1253 (JAVA)

by cornsilk-tea 2023. 6. 26.

문제 요약

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

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

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


문제 분석

주어진 수를 정렬한 후 투포인터 방식으로 찾아간다.


코드

package Week15;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import java.util.StringTokenizer;

public class BOJ_1253 {
    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());
        int idx = 0;
        while(st.hasMoreTokens()){
            arr[idx++] = Integer.parseInt(st.nextToken());
        }
        Arrays.sort(arr);
        int answer = 0;
        for(int curr = 0; curr < N; curr++){
            int currNum = arr[curr];
            int start = 0;
            int end = N-1;
            while(start < end){
                int sum = arr[start] + arr[end];
                // 두 수의 합이 현재 찾기위한 수보다 크다면
                if(sum > currNum){
                    // end포인트를 왼쪽으로 옮겨준다.
                    end--;
                }
                // 두 수의 합이 현재 찾기위한 수보다 작다면
                else if(sum < currNum){
                    // start포인트를 오른쪽으로 옮겨준다.
                    start++;
                }
                // 두 수의 합이 현재 찾기위한 수와 같다면
                else{
                    // 두 수엔 0이 들어갈 수 있기 때문에
                    // 우연의 경우라도 두 수에 찾기위한 수가 들어가면 안된다.
                    if(curr == start){
                        start++;
                    }
                    else if(curr == end){
                        end--;
                    }
                    else{
                        answer++;
                        break;
                    }
                }
            }
        }
        System.out.println(answer);
    }
}

정리

새로 배운 내용

없음

개선할 점

없음

더 찾아볼만한 사항

없음