관리 메뉴

DuckingRacoon

프로그래머스 | 연속 부분 수열 합의 개수 본문

알고리즘

프로그래머스 | 연속 부분 수열 합의 개수

따킹라쿤

출처

🌐 코딩테스트 연습 - 연속 부분 수열 합의 개수 | 프로그래머스 스쿨

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

풀이

1차 풀이

#include <vector>
#include <unordered_set>

using namespace std;

int solution(vector<int> elements) 
{
    unordered_set<int> sums;
    
    for(int diff = 0; diff < elements.size(); ++diff)
    {
        for(int i = 0; i < elements.size(); ++i)
        {
            int sum = 0;
            
            for(int j = i; j <= i+diff; j++)
            {
                sum += (j < elements.size())? elements[j] : elements[j - elements.size()];
            }
            
            sums.insert(sum);
        }
    }    
        
    return sums.size();
}

2차 풀이 (dp)

#include <vector>
#include <unordered_set>

using namespace std;

int solution(vector<int> elements) 
{
    vector<vector<int>> dp(elements.size(), vector<int>(elements.size()));
    
    for(int i = 0; i < elements.size(); ++i)
    {
        dp[i][0] = elements[i];        
    }

    
    for(int diff = 1; diff < elements.size(); ++diff)
    {
        for(int i = 0; i < elements.size(); ++i)
        {
            dp[i][diff] = dp[i][diff - 1];
            dp[i][diff] += (i + diff < elements.size())? elements[i + diff] : elements[i + diff - elements.size()];
        }
    }    
        
    unordered_set<int> sums;
    for(const vector<int>& sumRow : dp)
    {
        for(const int& s : sumRow)
        {
            sums.insert(s);   
        }
    }

    return sums.size();
}

2차 풀이 리팩토링

    #include <vector>
    #include <unordered_set>

    using namespace std;

    int solution(vector<int> elements) 
    {
        vector<vector<int>> dp(elements.size(), vector<int>(elements.size()));
        unordered_set<int> sums;

        for(int i = 0; i < elements.size(); ++i)
        {
            dp[i][0] = elements[i];
            sums.insert(dp[i][0]);
        }

        for(int diff = 1; diff < elements.size(); ++diff)
        {
            for(int i = 0; i < elements.size(); ++i)
            {
                dp[i][diff] = dp[i][diff - 1];
                dp[i][diff] += (i + diff < elements.size())? elements[i + diff] : elements[i + diff - elements.size()];

                sums.insert(dp[i][diff]);
            }
        }

        return sums.size();
    }
    #include <vector>
    #include <unordered_set>

    using namespace std;

    int solution(vector<int> elements) 
    {
        vector<vector<int>> dp(elements.size(), vector<int>(elements.size()));
        unordered_set<int> sums;

        for(int diff = 0; diff < elements.size(); ++diff)
        {
            for(int i = 0; i < elements.size(); ++i)
            {
                if(diff > 0)
                    dp[i][diff] = dp[i][diff - 1];

                int add = i + diff;
                dp[i][diff] += (add < elements.size())? elements[add] : elements[add - elements.size()];

                sums.insert(dp[i][diff]);
            }
        }

        return sums.size();
    }

'알고리즘' 카테고리의 다른 글

프로그래머스 | 할인 행사  (0) 2025.09.04
프로그래머스 | 괄호 회전하기  (0) 2025.09.04
프로그래머스 | 영어 끝말 잇기  (0) 2025.09.04
백준 | 평범한 배낭  (0) 2025.09.03
프로그래머스 | 단속카메라  (0) 2025.09.03