백준 1253 - 좋다

김예림·2025년 5월 5일

문제 파악

N개의 입력 받은 수를 하나씩 순회하며 해당 수가 다른 수 두 개의 합으로 나타내면 좋은 수 -> 그 좋은 수가 몇 개인지 찾는 문제
이것 역시 투포인터를 이용해 풀 수 있다.
판별의 대상이 되는 수를 K라고 했을 때 K가 N이 될 때까지 하나씩 옮겨가며 더했을 때 K가 되는 수가 있는지 찾기 있는지 찾기

풀이

  1. 수의 개수 N 입력 받기
  2. 버퍼리더와 스트링토크나이저를 이용해 띄어쓰기를 구분자로 해 입력받은 값을 버퍼에 넣어 한 번에 처리
  3. 입력 받은 값 모두 배열에 넣고 정렬
  4. 판별 대상이 되는 수 K가 N이 될 때까지 투포인터 수행
    a. 만약 같은 수를 더해서 K가 되면 안되기 때문에 처리 필요
    b. 서로 다른 수를 더해서 K가 되면 result 값 하나씩 올려주기

코드

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

public class 좋다 {

    public static void main(String[] args) throws IOException{
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));

        //수의 개수 N 입력받기
        int N = Integer.parseInt(bf.readLine());
        int[] nums = new int[N];
        StringTokenizer st = new StringTokenizer(bf.readLine());
        int K;
        int result = 0;

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

        //배열 오름차순 정렬
        Arrays.sort(nums);

        //판별 대상이 되는 수
        for (int i=0; i<N; i++) {
            K = nums[i];

            int start = 0;
            int end = N-1;

            //왼쪽 포인터가 오른쪽 포인터보다 작을 때까지지
            while (start < end) {
                //자기 자신을 더하지 않기 위해
                if (start == i) {
                    start++;
                    continue;
                }
                if (end == i) {
                    end--;
                    continue;
                }
                //두 값의 합이 판별 대상의 수 보다 작다면 start 포인터 오른쪽으로 이동
                if (nums[start] + nums[end] < K) {
                    start++;
                }
                //두 값의 합이 판별 대상의 수 보다 크다면 end 포인터 왼쪽으로 이동 
                else if (nums[start] + nums[end] > K) {
                    end--;
                }
                //같으면 좋은수이므로 하나 올려주기 
                else {
                    result++;
                    break;  //이미 좋은 수인게 확정 되었으므로 중복으로 카운트 하는 것 방지
                }
            }
        }
        System.out.println(result);
    }
}

0개의 댓글