프로그래머스/2레벨

연속 부분 수열 합의 개수/C++

Koalitsiya 2023. 1. 17. 15:51
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

길이가 len인 연속 부분 수열의 합을 모두 구해서 set을 통해 중복을 제거 한 후 set의 크기를 리턴하면 된다.

 

먼저 연속 부분 수열의 합을 모두 구한다고 할 때, 예시로 [7,9,1,1,4]로 이루어진 원형 수열이 있으면 길이가 len인 연속 부분 수열의 합의 종류는 아래와 같다.

len = 1 7 9 1 1 4
len = 2 16 10 2 5 11
len = 3 17 11 6 12 20
len = 4 18 15 13 21 21
len = 5 22 22 22 22 22

이를 자세히 보면 idx = i로 시작하는 연속 부분 수열들은 idx = 0의 값에 idx = len의 값을 순차적으로 더해준 값이다.

  idx = 0 idx = 1 idx = 2 idx = 3 idx = 4
len = 1 7 9 1 1 4
len = 2 16 10 2 5 11
len = 3 17 11 6 12 20
len = 4 18 15 13 21 21
len = 5 22 22 22 22 22

즉, 해당 표의 값들은 tmp에 elements[(index + len) % elements.size()]을 반복적으로 더해줌으로써 구할 수 있다.

 

1. set 자료구조 선언

2. 이중 for문을 통해 tmp = 0에 elements[(j + i) % elements.size()]의 값을 elements.size()번 더해주고, 더할 때마다 s에 삽입한다.

3. 반복문이 끝나면 s.size()를 리턴

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

using namespace std;

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

    for (int i = 0 ; i < elements.size() ; i++) {
        int tmp = 0;
        for (int j = 0 ; j < elements.size() ; j++) {
            tmp += elements[(j + i) % elements.size()];
            s.insert(tmp);
        }
    }

    return s.size();
}