ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준 2003] 수들의 합 2
    알고리즘/Brute Force 2019. 12. 30. 20:32

    Problem
    문제 바로가기

    Type : 브루트 포스, 투 포인터

    접근

    (1) 연속된 수의 합을 찾기 위한 O(n) 알고리즘으로 투 포인터 알고리즘 이 있다
    (2) 투 포인터 알고리즘 이란 피봇 2개를 적절히 움직여 답이 되는 구간 혹은 경우의 수를 찾는 알고리즘을 말한다.

    플로우차트

    Problem

    주의할 점

    (1) i보다 j가 더 커지는 경우가 존재 한다.

    ex) n = 8, arr = 1, 2, 9, 2

    i가 9 위에 존재 할 때 항상 sum이 n 보다 크므로 j를 계속 증가 시킨다
    이를 대비하여 j가 i를 넘어 갈때는 sum 과 i 를 다시 초기화 시켜 준다.

    구현 코드

    
    #include <iostream>
    #include <vector>
    using namespace std;
    
    vector<int> arr;
    int n, m;
    
    int solve(){
        int cnt = 0;
        int sum = arr[0];
        int i, j;
        i = j = 0;
    
        while (i < n && j < n ) {
            if(sum < m){
                sum += arr[++i];
            }else if(sum == m){
                cnt++;
                sum += arr[++i];
            }else if(sum > m){
                sum -= arr[j++];
                if(i < j){
                    sum = arr[j];
                    i = j;
                }
            }
        }
        return cnt;
    }
    
    int main(int argc, const char * argv[]) {
        cin>>n>>m;
        arr = vector<int>(n);
        for(int i = 0; i < n ; i++){
            cin>>arr[i];
        }
        cout<<solve()<<endl;
        return 0;
    }
    
    

    깨달은 점

    1. 배열의 연속합을 구할때 투 포인터 알고리즘을 사용할 수 있다.

    '알고리즘 > Brute Force' 카테고리의 다른 글

    [백준 2143] 두배열의 합  (0) 2019.12.30
    [백준 12100] 2048(easy)  (0) 2019.12.30
    [백준 1107] 리모콘  (0) 2019.12.27
    [백준14889] 스타트와 링크  (0) 2019.12.27
    [백준 6064] 카잉달력  (0) 2019.12.26
Designed by Tistory.