‡ CODING TEST STUDY ‡/º 백준

[백준 | Java Silver IV] (#1940) 주몽

Trudy | 송연 2024. 8. 12. 22:51

문제 

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


 

접근

투포인터를 사용해서 풀 수 있었던 문제이다. 

 

두 재료의 합이 m이 되는 개수를 찾아야 한다. 

 

따라서 주어진 배열을 먼저 정렬하고, start과 end로 가장 앞과 뒤에 포인터를 두고, 두개의 합이 m보다 작다면 end를 증가시켜주고, m보다 크다면 start를 감소시켜서 m 값을 찾아가도록 한다. 

 

그렇게 start과 end의 위치가 교차되어 순서가 바뀌는 순간 while문을 종료되고, count를 출력한다. 

최종 코드

package week14.baek.august13.baek;

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

public class S1940 {
    public static void main(String[] args) throws IOException {
        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 start = 0;
        int end =n-1;

        int sum = 0; 
        int count = 0;

        while(start < end){ // start 포인터가 end보다 더 커진다면 종료
            sum = arr[start] + arr[end];
            if(sum < m){
                //아직 작다면 시작 포인터를 증가 시킴
                start++;
            } else if(sum==m){
                start++;
                end--;
                count++;
            } else{
                // 크다면 마지막 포인터를 감소
                end--;
            }
        }

        System.out.println(count);
    }
}

Reference

https://thaud153.tistory.com/84