본문 바로가기
알고리즘

백준 s4 2003 수들의 합 2 c++

by kyj0032 2024. 3. 1.

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

 

2003번: 수들의 합 2

첫째 줄에 N(1 ≤ N ≤ 10,000), M(1 ≤ M ≤ 300,000,000)이 주어진다. 다음 줄에는 A[1], A[2], …, A[N]이 공백으로 분리되어 주어진다. 각각의 A[x]는 30,000을 넘지 않는 자연수이다.

www.acmicpc.net

 

문제

길이가 N인 수열이 주어질 때, A[i] ~ A[j]의 합이 M인 경우의 수 구하기

 

풀이

그냥 이중 for문으로 풀면 10^8이라 시간 초과가 날 수도 있음 .. 

투 포인터로 O(N)으로 구할 수 있다

 

수도 코드

// en범위를 넘으면, sum에 더할 수 있는 건 다 더했는데도 M은 못 넘은 거 이므로 끝내는 게 맞음
while: st < N && en < N
	if sum == M
    	ans++
        st 한 칸 옮기고 sum -=
    else if sum < M
    	en 한 칸 옮기고 sum +=
	else if sum > M
    	st 한 칸 옮겨서 합 줄이기 sum -=

 

 

전체 코드

/*boj s4 2003 수들의 합 2*/
#include <iostream>
#define MAXN 10005
using namespace std;

int N, M;
int arr[MAXN];
int main(void) {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> N >> M;

    for (int i = 0; i < N; i++)
        cin >> arr[i];

    int st = 0;
    int en = 0;
    int sum = arr[st];

    int ans = 0;
    while (st < N && en < N) {
        if (sum == M) {
            ans++;
            sum -= arr[st];
            st++;
        } else if (sum < M) {
            en++;
            sum += arr[en];
        } else { // sum > M
            sum -= arr[st];
            st++;
        }
    }

    cout << ans << "\n";
}

'알고리즘' 카테고리의 다른 글

백준 g4 1644 소수의 연속합 c++  (0) 2024.03.02
백준 s1 2531 회전 초밥 c++  (0) 2024.03.02
백준 g4 1806 부분합 c++  (0) 2024.02.29
백준 g5 2230 수 고르기 c++  (0) 2024.02.29
SQL 정리  (0) 2024.02.28