happy318
팽도리블로그
happy318
전체 방문자
오늘
어제
  • 전체글 (252)
    • 공부 (5)
      • Algorithm 정리 (0)
      • 논문리뷰 (1)
      • C++ (2)
      • Python (2)
      • Java (0)
      • Back-end (0)
      • Front-end (0)
      • Embedded (0)
    • 코딩테스트 (218)
      • Python 문제풀이 (100)
      • C++ 문제풀이 (108)
      • Python template (9)
      • C++ template (1)
    • 일상 (20)
      • 맛집 (13)
      • 쇼핑 (5)
      • 아무 일상 (2)
    • 게임 (9)
      • 메이플스토리 (9)

최근 글

인기 글

hELLO · Designed By 정상우.
happy318

팽도리블로그

코딩테스트/C++ 문제풀이

[백준] 부분수열의 합

2023. 4. 14. 11:53

https://www.acmicpc.net/problem/1182

 

1182번: 부분수열의 합

첫째 줄에 정수의 개수를 나타내는 N과 정수 S가 주어진다. (1 ≤ N ≤ 20, |S| ≤ 1,000,000) 둘째 줄에 N개의 정수가 빈 칸을 사이에 두고 주어진다. 주어지는 정수의 절댓값은 100,000을 넘지 않는다.

www.acmicpc.net

우선 문제부터 간단하게 요약하면, 

 

N개의 정수로 이루어진 수열이 있을 때, 크기가 양수인 부분수열중 그 수열의 원소를 다 더한 값이 S가 되는 경우의 수를 구해야 하는 문제입니다.

 

<Solution>

정수의 개수가 1~20개라고 문제에서 주어졌으므로 dfs알고리즘을 통해 충분히 해결할 수 있을 것을 알 수 있습니다.

 

그래서 고르거나 고르지 않거나로 분기하여 dfs를 진행하고, 만약 합이 S가 되는데 성공하면, 갯수를 세어 주는 방식으로 구현 하면 됩니다. 주의 해야 하는 점은 만약 처음 주어진 값 S가 0이라면, 아무 원소도 고르지 않는 경우가 카운팅 되기 때문에 구해진 갯수에서 1을 빼주어야 함을 알 수 있습니다. 

 

실제 구현은 아래와 같습니다.

#include <iostream>

using namespace std;

int N, S;
int cnt;

int numArray[30];

void dfs(int curIndex, int curSum){
    if(curIndex == N){
        if(curSum == S) cnt++;
        return;
    }
    // 고르는 경우
    dfs(curIndex+1, curSum+numArray[curIndex]);
    // 고르지 않는 경우
    dfs(curIndex+1, curSum);
    return;
}

int main(){
    cin >> N >> S;
    for(int i = 0; i < N; i++){
        cin >> numArray[i];
    }
    dfs(0, 0);

    if(S == 0) cnt--;

    cout << cnt << endl;

    return 0;
}
반응형

'코딩테스트 > C++ 문제풀이' 카테고리의 다른 글

[백준] 두 동전  (0) 2023.05.07
[백준] 부분수열의 합  (0) 2023.04.14
[백준] 로또  (0) 2023.03.26
[백준] 단어 수학  (0) 2023.03.26
[백준] 부등호  (2) 2023.03.26
    '코딩테스트/C++ 문제풀이' 카테고리의 다른 글
    • [백준] 두 동전
    • [백준] 부분수열의 합
    • [백준] 로또
    • [백준] 단어 수학
    happy318
    happy318

    티스토리툴바