본문 바로가기
Algorithm/C++

[백준 2003] 수들의 합 2

by imagineer_jinny 2022. 11. 1.

2003번: 수들의 합 2 (acmicpc.net)

 

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

 

내 풀이

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int n,m;
int a[10004];
int en,tot;
int cnt=0;
int main(void) {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cin>>n>>m;
  
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
    }
    
    en=0;
    tot=a[0];
    for(int st=0;st<n;st++)
    {
        while(en<n&&tot<m)
        {
            en++;
            if(en!=n)
            {
                tot+=a[en];
                
            }
           
        }
        if(en==n)break;
         if(tot==m)
        {
            cnt++;
        }
        tot-=a[st];
       
    }
    
   cout<<cnt;
}

 

 

다른 풀이

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;

ll pf_sum[10005];

int main(void){
  ios::sync_with_stdio(0);
  cin.tie(0);

  int n, m;
  cin >> n >> m;

  pf_sum[0] = 0;
  for (int i = 1; i <= n; i++) cin >> pf_sum[i], pf_sum[i] += pf_sum[i - 1];

  int lp = 0, rp = 0;
  int ans = 0;

  while (rp <= n) {
    ll csum = pf_sum[rp] - pf_sum[lp];
    if (csum <= m) {
      if (csum == m) ans++;
      rp++;
    }
    else lp++;
  }

  cout << ans;
}

/*
구간의 합을 관리할 때 강의 내에서 소개한 방법과 같이 tot 변수를 하나 들고 있어도 되고 이 코드와 같이 prefix sum을 이용해도 됨
*/

'Algorithm > C++' 카테고리의 다른 글

[백준 4344] 평균은 넘겠지  (0) 2023.08.19
[백준 1920] 수 찾기  (0) 2022.11.01
[백준 1806] 부분합  (0) 2022.11.01
[백준 2230] 수 고르기  (0) 2022.11.01
[백준 14888] 연산자 끼워넣기  (0) 2022.10.20

댓글