ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 1806 - 부분합
    백준 algorithm 2021. 11. 1. 23:02
    반응형

    문제 설명

     

     

     

    예제 입력 / 출력

     

     

    => 투 포인터 알고리즘의 개념을 알면 풀 수 있는 문제입니다. (저도 이 문제를 풀면서 처음으로 해당 알고리즘을 들었습니다.) 

     

    => start 점과 end 점의 위치를 변환해가며 S의 값을 넘으면 가장 적은 길이를 찾아내는 방법입니다. 

     

    => while문에서는 end가 0 인경우에 값을 부분합에 포함하지 않으므로, 이전에 값을 더해주는 과정이 필요합니다. 

     

    => while문을 통해 start 점이 end점을 앞서지 못하도록 하며, end점이 N(배열 원소의 개수)를 넘지 못하도록 합니다.

    (배열의 끝점 = (원소의 갯수 -1) )

     

    => 부분합이 S를 넘지 못할 경우 end점을 뒤로 한 칸 미루며 다시 한번 계산합니다. 

     

    => 부분합이 S인 경우, 최소값을 구하고 다시 한번 end점을 뒤로 미룹니다. ( 이후 부분합이 S값을 넘는 경우에서 해당 값은 걸러집니다. )

     

    => 부분합이 S를 넘는 경우, start점의 값을 부분합에서 빼며 start점을 뒤로 미룹니다. (ex  start의 위치 : 0 →1 ) 

     

    => 해당 과정을 while문이 끝날때까지 반복합니다.  

     

     

    #include <iostream>
    #include <algorithm>
    #include <string>
    #include <vector>
    #include <limits.h>
    
    
    using namespace std;
    
    int main()
    {
        ios_base::sync_with_stdio(false);
        cin.tie(nullptr);
        cout.tie(nullptr);
       
        int arr[100001];
        int N, S;
        const int INF = INT_MAX;
        
        cin >> N >> S;
        
        for(int i=0; i<N; i++) cin >> arr[i];
        
        
        int start=0, end =0;
        int sum = arr[0];
        int answer = INF;
        while(start <= end && end < N )
        {
            if (sum < S) // 아직 부분합이 S를 만족하지 못하는 경우
            {
                sum += arr[++end];
            }
            else if ( sum == S)//원하는 값을 찾았을 경우
            {
                answer = min(answer, (end - start +1)); //최소값 찾기
                sum += arr[++end];
            }
            else //원하는 값보다 큰 경우
            {
                answer = min(answer, (end - start +1)); //최소값 찾기
                sum -= arr[start++];
            }
        }
        
        if (answer == INF) answer =0;
        cout <<answer<<'\n';
        
        return 0;
    }

     

     

     

     

    실행 화면

    반응형

    '백준 algorithm' 카테고리의 다른 글

    백준 2178 - 미로탐색 C++  (0) 2022.03.28
    백준 2003 수들의 합 2 C++  (0) 2021.11.02
    백준 10757 - 큰수찾기  (0) 2021.06.30
    백준 1193 - 분수찾기  (2) 2021.01.04
    백준 2523 - 별 찍기 - 13  (0) 2020.08.24

    댓글

Designed by Who.