카테고리 없음

백준 2003번 - 수들의 합2

우진하다 2023. 5. 29. 22:54

나의 풀이.

이 문제는 투 포인터로 풀어보라는 힌트가 있었기에 for - loop을 사용하지 않고 풀어보고
사실 아직 알고리즘에 대한 이해가 낮아 기존 학습했던 코드를 참고 삼아 이해하려 하며 다시 풀어보았다.

투 포인터(Two Pointers)는 배열에서 두 개의 포인터를 사용해서 원하는 결과를 얻는 방법으로
두 개 포인터의 배치 방법은
- 같은 방향에서 시작: 첫번째 원소에 둘다 배치
- 서로 다른 방향에서 시작 : 첫번째 원소와 마지막 원소에 배치
이번 문제는 같은 방향에서 시작하는 방법으로 작성해보았다.

아직은 많이 어렵다. 이해하도록 노력하자.

import java.util.Scanner;

public class SumOfNumbers2003 {
    public static int twoPointer(int[] arr, int target) {
        int p1 = 0;
        int p2 = 0;
        int sum = 0;
        int cnt = 0;

        while (true) {
            if (sum > target) {
                sum -= arr[p1++];
            } else if (p2 == arr.length) {
                break;
            } else {
                sum += arr[p2++];
            }

            if (sum == target) {
                cnt += 1;
            }
        }
        return cnt;
    }
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int N = sc.nextInt();
        int M = sc.nextInt();
        int[] arr = new int[N];
        for (int i = 0; i < N ; i++) {
            arr[i] = sc.nextInt();
        }
        System.out.println(twoPointer(arr, M));
    }
}

 

 


문제 출처 : https://www.acmicpc.net/problem/2003