Notice
Recent Posts
Recent Comments
Link
250x250
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

피너클의 it공부방

백준 2003 수들의 합 2 (c++) : 피너클 본문

백준

백준 2003 수들의 합 2 (c++) : 피너클

피너클 2022. 9. 2. 19:05
728x90
반응형

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

투 포인터 문제다.

int n, m;
int arr[10001];

사용할 변수다.

cin >> n >> m;
for (int i = 0; i < n; i++) cin >> arr[i];
int ans = 0, sum = 0;
int start = 0, end = 0;

값들을 입력받는다.

start와 end는 투 포인터에서 사용할것이다.

while (end <= n) {

while문은 end가 n보다 같고 작은 동안 반복된다.

    if (sum == m) {
        ans++;
        sum -= arr[start++];
    }

sum==m이라면 ans를 올리고 sum에서 arr[start]를 빼며 start++를한다.

    else if (sum > m) {
        sum -= arr[start++];
    }

sum이 m보다 크다면 sum을 줄여야한다. sum에서 arr[start]를 빼며 start++를한다.

    else {
        sum += arr[end++];
    }
}
cout << ans << '\n';

이도 아니라면 m보다 작다는 것이다. sum을 더 크게해야한다. sum에서 arr[end]를 더하며 end++를한다.

반복이 끝나면 ans를 출력하면 된다.

#include <iostream>

using namespace std;

int n, m;
int arr[10001];

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    cin >> n >> m;
    for (int i = 0; i < n; i++) cin >> arr[i];
    int ans = 0, sum = 0;
    int start = 0, end = 0;
    while (end <= n) {
        if (sum == m) {
            ans++;
            sum -= arr[start++];
        }
        else if (sum > m) {
            sum -= arr[start++];
        }
        else {
            sum += arr[end++];
        }
    }
    cout << ans << '\n';
}

전체코드다.

728x90
반응형
Comments