원형 수열 풀이

Subin·2025년 1월 8일

Algorithm

목록 보기
58/69

문제는

수열 {1, 1, 4, 7, 9} 가 있을 때
연속된 1개씩 더한 값: 1, 1, 4, 7, 9
연속된 2개씩 더한 값: 2, 5, 11, 16, 10
...
연속된 5개씩 더한 값: 22

했을 때 이 값들을 배열에 넣고, 중복된 수를 뺐을 때 총 몇 개인지를 반환하는 문제였다.

이 문제는 이중 벡터를 사용한 dp 방식으로 푸는 게 좋아보였다.

i, j 말고도 k를 사용해서 맨 뒷 숫자가 맨 앞 숫자와도 연결되도록 하는 것이 중요했다.

#include <string>
#include <vector>
#include <set>

using namespace std;

int solution(vector<int> elements) {
    int answer = 0;
    set<int> numbers; // 합들을 여기 저장해두면 자동으로 겹치는 수는 없어짐
    int Size = elements.size();
    vector<vector<int>> dp(Size, vector<int>(Size));
    
    for(int i=0; i < elements.size(); i++)
    {
        dp[0][i] = elements[i];
        numbers.insert(dp[0][i]);
    }
    
    for(int i=1; i < elements.size(); i++)
    {
        for(int j=0, k=i; j<elements.size(); ++j, k = (k==Size-1)? 0 : ++k)
        {
            dp[i][j] = dp[i-1][j] + dp[0][k];
            numbers.insert(dp[i][j]);
        }
    }
    
    answer = numbers.size();
    
    return answer;
}

완전탐색으로 풀려고 했지만,
실무에서는 위 방식이 더 좋다고 하여 기록해본다.

<완전탐색 코드>

#include <string>
#include <vector>
#include <set>

using namespace std;

int solution(vector<int> elements) {
    set<int> S;

    int n = elements.size();

    for (int i = 0 ; i < n ; ++i) {
        int sum = 0;
        for (int j = i ; j < i + n ; ++j) {
            sum += elements[j % n];
            S.insert(sum);
        }
    }

    return S.size();
}
profile
성장하며 꿈꾸는 삶을 살아가고 있는 대학생입니다😊

0개의 댓글