백준 2003 수들의 합 2 (Java,자바)

jonghyukLee·2022년 3월 16일
0

이번에 풀어본 문제는
백준 2003번 수들의 합 2 입니다.

📕 문제 링크

❗️코드

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

public class Main {
    static int [] map;
    static int N,M;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
        map = new int[N];
        st = new StringTokenizer(br.readLine());
        for(int i = 0; i < N; ++i) map[i] = Integer.parseInt(st.nextToken());

        int res = 0;
        int e = 0;
        int sum = map[0];
        for(int s = 0; s < N; ++s)
        {
            while(e < N && sum < M)
            {
                e++;
                if(e != N) sum += map[e];
            }
            if(e == N) break;
            if(sum == M) res++;
            sum -= map[s];
        }
        System.out.print(res);
    }

}

📝 풀이

N개의 수로 구성된 수열에서 연속된 부분수열의 합이 M이 되는 경우의 수를 구하는 문제입니다.
0번 인덱스 부터 시작하여 투포인터를 사용하면 쉽게 해결할 수 있습니다.
현재 누적된 부분수열의 총합을 담고있는 sum이 M값보다 작다면 end값을 올려 부분수열의 범위를 넓히고, M보다 크거나 같다면 start를 올려 범위를 줄여나가면 됩니다. 이 과정에서 현재 부분수열의 합이 M값과 일치한다면 결과 카운트값을 1 증가시켜주며 start포인터를 올려 다음 부분수열을 계속 탐색해주면 됩니다.

📜 후기

오늘은 투포인터를 유형을 중심적으로 공부해보았습니다. 인덱스 하나차이로 에러나 일부 케이스에서 정확하지 않은 결괏값을 내기 때문에 조금 꼼꼼하게 확인해야하는 유형인 것 같습니다.

profile
머무르지 않기!

1개의 댓글

comment-user-thumbnail
2022년 3월 22일

재미있는 문제에요.

답글 달기