알고리즘/백준

[백준] 1940 -자바

삼록이 2025. 7. 17. 14:55

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

 

이 문제는 앞선 문제와 달리 2개의 포인터를 각각 양쪽 끝에 두는게 포인트다.

그리고 오름차순으로 정렬을 해야 포인터들의 이동이 일관되게 가능하다.


public class Main {
    public static void main(String[] args) throws IOException {
        /*
        1.첫째줄에 재료 개수n, 둘째줄에 필요한 수m를 받는다
        2.셋째줄에 StringTokenizer를 이용 배열arr에 담는다.
        3.투포인터를 사용하기 위해 배열을 오름차순 정렬한다.
        4.스타트포인터는 배열의 맨 앞에 , 엔드포인터는 배열의 맨뒤에 두고, 스타트포인터는 오른쪽으로, 엔드포인터는 왼쪽으로 진행방향을 잡는다.
        5.while반복하는데 스타트포인터가 엔드포인터보다 작을 동안 계속반복
           if(sum==m) 스타트포인터+1
           if(sum>m) 엔드포인터-1;
           if(sum<m) 스타트포인터+1;
         */

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        int m = Integer.parseInt(br.readLine());
        StringTokenizer st = new StringTokenizer(br.readLine()," ");
        int[] arr = new int[n];
        for(int i=0; i<n; i++){
            arr[i] = Integer.parseInt(st.nextToken());
        }

        Arrays.sort(arr);
        int startPointer =0;
        int endPointer = arr.length-1;
        int answer =0;

        while(startPointer<endPointer){
            int sum = arr[startPointer] + arr[endPointer];

            if(sum == m){
                answer++;
                startPointer++;
            } else if(sum>m){
                endPointer--;
            } else{ //sum<m
                startPointer++;
            }
        }
        System.out.println(answer);
    }
}

 


이렇게 해도 정답이었으나,

명확하게는 한번 썼던 재료는 다시 못쓰는게 맞으니 sum==일때 startPointer만 ++로 이동시키는 게 아니라 endPointer도 --로 이동시켜야한다. 문제에서는 숫자재료가 중복된 값이 주어지지않아 문제가 없었으나 중복된 값이 주어졌다면 sum == m 일때, 교재처럼 endPointer도 왼쪽으로 이동시키는 것 까지 하는게 맞다.