[백준]2003-수들의 합 2(Java)

김성호·2023년 4월 7일

문제 링크

[문제]

[풀이]

  1. 해당 문제는 전형적인 투 포인터 문제의 유형 중 하나이다.
  2. p1, p2를 배열의 처음으로 두고 M과 그 값을 비교하면서 작은 경우에는 p2를 한 칸씩 이동을 하고 큰 경우에는 p1을 한 칸씩 이동하면서 값을 찾아 나간다.

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int N = Integer.parseInt(st.nextToken());
        int target = Integer.parseInt(st.nextToken());

        int[] arr = new int[N];
        st = new StringTokenizer(br.readLine());

        // 입력받아 배열의 요소에 할당
        for (int i = 0; i < N; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }

        int cnt = 0;
        int sum = 0; // 합계를 담을 변수
        int p1 = 0; // 인덱스를 가르킬 포인터 1
        int p2 = 0; // 인덱스를 가르킬 포인터 2

        while (true) {
            if (sum > target) { // 구간의 합이 target 보다 큰 경우
                sum -= arr[p1++];
            } else if (p2 == arr.length) { // 포인터가 배열의 끝까지 온 경우
                break;
            } else { // 구간의 합이 target 보다 작은 경우
                sum += arr[p2++];
            }
            // 구간의 합이 target과 같은 경우 cnt 증가
            if (sum == target) {
                cnt++;
            }
        }

        System.out.println(cnt);
    }
}
profile
백엔드 개발자가 되고 싶은 예비 개발자 입니다.

0개의 댓글