happy318
팽도리블로그
happy318
전체 방문자
오늘
어제
  • 전체글 (252)
    • 공부 (5)
      • Algorithm 정리 (0)
      • 논문리뷰 (1)
      • C++ (2)
      • Python (2)
      • Java (0)
      • Back-end (0)
      • Front-end (0)
      • Embedded (0)
    • 코딩테스트 (218)
      • Python 문제풀이 (100)
      • C++ 문제풀이 (108)
      • Python template (9)
      • C++ template (1)
    • 일상 (20)
      • 맛집 (13)
      • 쇼핑 (5)
      • 아무 일상 (2)
    • 게임 (9)
      • 메이플스토리 (9)

최근 글

인기 글

hELLO · Designed By 정상우.
happy318

팽도리블로그

코딩테스트/C++ 문제풀이

[백준] 부분합

2023. 3. 5. 22:27

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

 

1806번: 부분합

첫째 줄에 N (10 ≤ N < 100,000)과 S (0 < S ≤ 100,000,000)가 주어진다. 둘째 줄에는 수열이 주어진다. 수열의 각 원소는 공백으로 구분되어져 있으며, 10,000이하의 자연수이다.

www.acmicpc.net

우선 문제부터 간단하게 요약하면, 

 

길이 N의 수열이 주어질 때, 이 수열에서 연속된 수들의 부분합 중 그 합이 S 이상이 되는 것중 가장 짧은 것의 길이를 출력해야 하는 문제입니다. 

 

<Solution>

어렵지 않은 투포인터와 누적합을 이용하는 문제입니다. 실제 구현은 아래와 같습니다. 주의 해야 하는 점은 만약 합을 만들지 못하는 경우 0 을 출력해야 한다는 점만 주의해서 코드를 구성하면 됩니다. 

 

#include <iostream>

using namespace std;

int N, S;
int numArray[100000+10];
int pSumArray[100000+10];

int main(){
    cin >> N >> S;

    // get numArray
    for(int i = 1; i<=N; i++){
        cin >> numArray[i];
    }

    // build prefix sum array
    for(int i = 1; i<=N; i++){
        pSumArray[i] = pSumArray[i-1] + numArray[i];
    }

    // two pointer
    int s = 0, e = 0;
    int minLength = 987654321;

    while(e<=N && s<=N){
        int curSum = pSumArray[e]-pSumArray[s];

        if(curSum<S) e++;
        else{
            minLength = min(minLength, e-s);
            s++;
        }
    }

    if(minLength == 987654321) minLength = 0;
    cout << minLength << endl;

    return 0;

}
반응형

'코딩테스트 > C++ 문제풀이' 카테고리의 다른 글

[백준] 줄 세우기  (0) 2023.03.12
[백준] 용액  (0) 2023.03.12
[백준] 도시 분할 계획  (0) 2023.03.05
[백준] 소수의 연속합  (0) 2023.03.04
[백준] 계단 수  (0) 2023.03.02
    '코딩테스트/C++ 문제풀이' 카테고리의 다른 글
    • [백준] 줄 세우기
    • [백준] 용액
    • [백준] 도시 분할 계획
    • [백준] 소수의 연속합
    happy318
    happy318

    티스토리툴바