알고리즘

[programmers] 연속 부분 수열 합의 개수

졔졔311 2023. 5. 20. 12:17
728x90
반응형

https://school.programmers.co.kr/learn/courses/30/lessons/131701

 

프로그래머스

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

programmers.co.kr

---------------------------------------------------핵심 알고리즘--------------------------------------------

 

원형 수열이 되도록 수열을 두 번 반복하기.

index를 0~len-1까지 증가시키면서 sum을 구하는데, 그 길이를 1~len까지 늘리기. (sliding window?)

set에 이 합들을 저장해 중복되지 않는 개수를 구하기.

 

---------------------------------------------------풀이----------------------------------------------------

 

원형 수열에서 원하는 길이를 찾아야하므로, 주어진 수열을 한 번 더 반복해 붙여준다.

즉, 1 2 3 4 5이면 1 2 3 4 5 1 2 3 4 5 이런식으로 만들어준다.

그리고 여기서 0~len-1까지를 시작 인덱스로 잡아주면 원형 수열에서의 연속 부분 수열의 값을 찾을 수 있다.

 

시작 인덱스에 대해서 sliding window처럼 사용하는데, 이 길이를 1~len까지 변화시킨다.

그 합을 각각 구해주고, set에 저장한다.

set은 중복되지 않은 값만 저장할 수 있으므로 unique한 값들이 저장된다.

따라서 set의 개수를 리턴하면 합의 종류를 모두 리턴할 수 있다.

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

using namespace std;

// 원형 수열의 연속하는 부분 수열의 합으로 만들 수 있는 수의 종류=?
int solution(vector<int> elements) {
    int answer = 0;
    int len = elements.size();
    // 원형이므로 뒤에 한 번 더 반복해 이어붙여주기
    for(int i = 0; i < len; i++){
        elements.push_back(elements[i]);
    }
    
    // 합들을 저장할 set
    set<int> s;
    
    // 연속 부분 수열의 합 구하기
    for(int i = 0; i < len; i++){
        int sum = 0;
        // i~i+j까지의 합
        for(int j = 0; j < len; j++){
            sum += elements[i+j];
            s.insert(sum);
        }
    }
    
    answer = s.size();
    return answer;
}

 

---------------------------------------------------후기----------------------------------------------------

 

부분 수열을 단순하게 구해봤는데 통과가 된다.

더 효율적인 방법이 없을지 고민해 보는게 좋을 것 같다.

728x90
반응형

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

[BOJ] 1874 스택수열  (1) 2023.05.24
[programmers] 혼자 놀기의 달인  (0) 2023.05.20
[programmers] 고고학 최고의 발견  (1) 2023.05.19
[programmers] 2차원 동전 뒤집기  (0) 2023.05.18
[programmers] 택배상자  (0) 2023.05.18