[프로그래머스 / C++] 연습 부분 수열 합의 개수

YH·2024년 1월 4일
0

문제

연습 부분 수열 합의 개수 : 문제 링크


문제 분석

  • 철호는 수열을 가지고 놀기 좋아한다. 어느 날 철호는 어떤 자연수로 이루어진 원형 수열의 연속하는 부분 수열의 합으로 만들 수 있는 수가 모두 몇 가지인지 알아보고 싶어졌다. 원형 수열이란 일반적인 수열에서 처음과 끝이 연결된 형태의 수열을 말한다. 예를 들어 수열 [7, 9, 1, 1, 4] 로 원형 수열을 만들면 다음과 같다.

  • 원형 수열은 처음과 끝이 연결되어 끊기는 부분이 없기 때문에 연속하는 부분 수열도 일반적인 수열보다 많아진다. 원형 수열의 모든 원소 elements가 순서대로 주어질 때, 원형 수열의 연속 부분 수열 합으로 만들 수 있는 수의 개수를 return 하도록 solution 함수를 완성

  • 제한 사항

  • 3 ≤ elements의 길이 ≤ 1,000
  • 1 ≤ elements의 원소 ≤ 1,000
  • 연속 부분 수열의 중복되는 값을 제외해야 한다. 따라서, 중복된 요소를 허용하지 않는 set을 사용하므로 set 헤더를 include
  • 원형 수열의 연속 부분 수열 합으로 만들수 있는 개수를 저장할 정수형 변수 answer을 0으로, 연속 부분 수열의 합을 저장할 set형 seq를 초기화. 이중 for loop를 사용하고, 외부 loop는 연속 부분 수열 합을 저장할 정수형 변수 sum을 0으로 초기화하고, elements의 첫번째부터 마지막까지 순회하고, 내부 loop는 각 시작 요소에서 가능한 모든 연속 부분 수열을 순회. 현재 인덱스가 벡터의 크기를 초과하지 않으면서 원형으로 요소를 순회하기 위해, 인덱스 j에서 elements의 크기를 나눈 나머지를 저장할 정수형 변수 idx를 초기화. elements의 idx 위치의 원소를 sum에 더하고 저장하고, sum을 seq에 저장. loop 탈출 후, 연속 부분 수열 합으로 만들수 있는 수의 개수를 의미하는 seq의 크기를 answer에 저장하고, answer을 return

풀이

#include <vector>
#include <set>

using namespace std;

int solution(vector<int> elements) {
    int answer = 0;
    set<int> seq;
    
    for(int i = 0; i < elements.size(); ++i) {
        int sum = 0;
        for(int j = i; j < i + elements.size(); ++j) {
            int idx = j % elements.size();
            sum += elements[idx];
            seq.insert(sum);
        }
    }
    answer = seq.size();
    return answer;
}
profile
Keep Recycling Your Dreams

0개의 댓글