๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm๐Ÿฐ/๋ฐฑ์ค€

[๋ฐฑ์ค€] 2003 ์ˆ˜๋“ค์˜ ํ•ฉ2 ํˆฌ ํฌ์ธํ„ฐ

by Jouureee 2021. 2. 26.

๋ฌธ์ œ :

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

๋ถ„์„ :

ํˆฌ ํฌ์ธํ„ฐ๋ž€ 1์ฐจ์› ๋ฐฐ์—ด์— ๋Œ€ํ•ด ํฌ์ธํ„ฐ๋ฅผ ์–‘ ๋๋‹จ์— ๋‘๊ณ  ๊ฐ’์„ ์ฐพ๋Š” ๋ฐฉ์‹์„ ๋งํ•œ๋‹ค.

์กฐ๊ฑด(m)์— ํ•ด๋‹น ๋˜๋Š” ๊ฐ’์„ ์ฐพ์œผ๋ฉด cnt๋ฅผ ์ฆ๊ฐ€

m ๋ณด๋‹ค ์ž‘์€ ๊ฐ’์ด๋ฉด end ์ธ๋ฑ์Šค ์œ„์น˜์˜ ๊ฐ’์„ sum์— ์ €์žฅํ•˜๊ณ  end ํ•˜๋‚˜ ์ฆ๊ฐ€

m ๋ณด๋‹ค ํฐ ๊ฐ’์ด๋ฉด start ์ธ๋ฑ์Šค์˜ ๊ฐ’์„ ๋นผ๊ณ  start๋ฅผ ํ•˜๋‚˜ ์ฆ๊ฐ€์‹œํ‚ด 

 

c++ ์ฝ”๋“œ :

//
//  2003_sum2.cpp
//  SOMA๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป
//
//  Created by JoSoJeong on 2021/02/26.
//

#include <stdio.h>
#include <iostream>
#include <vector>


using namespace std;

int two_pointer(int N, int arr[], int M){
    int cnt = 0;
    int start = 0, end = 0;
    int sum = 0;
    
    while(true){
        
        if(sum >= M){
            sum = sum - arr[start++]; // ๊ฐ’์„ ๋นผ์ฃผ๊ณ  start ์ธ๋ฑ์Šค ๋’ค๋กœ ๊ฐ
        }else if(end == N){ // end ๊ฐ€ ์ธ๋ฑ์Šค ๋ฒ”์œ„ ๋ฒ—์–ด๋‚ฌ์„ ๊ฒฝ์šฐ
            break;
        }else{ // end ํ˜„์žฌ ์œ„์น˜๊ฐ’ ์ €์žฅ ํ›„ end ๋’ค๋กœ ์ด๋™
            sum = sum + arr[end++];
        }
        
        if(sum == M){
            cnt++;
        }
    }
    
    return cnt;
}
int main(){
    int N, M;
    cin >> N >> M;
    int arr[N];
    for(int i =0; i < N; i++){
        cin >> arr[i];
    }
  
    int cnt = two_pointer(N, arr, M);
    cout << cnt << endl;
    return 0;
}

๋Œ“๊ธ€