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. 13:34

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

 

14225번: 부분수열의 합

수열 S가 주어졌을 때, 수열 S의 부분 수열의 합으로 나올 수 없는 가장 작은 자연수를 구하는 프로그램을 작성하시오. 예를 들어, S = [5, 1, 2]인 경우에 1, 2, 3(=1+2), 5, 6(=1+5), 7(=2+5), 8(=1+2+5)을 만들

www.acmicpc.net

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

 

수열 S가 주어질 때, 해당 수열의 부분수열의 합으로 나올 수 없는 가장 작은 자연수를 구해야 하는 문제입니다.

 

<Solution>

우선 문제에서 수열의 길이가 20이하로 주어졌기 때문에, dfs로 충분히 해결할 수 있음을 알 수 있습니다. 그리고 각각의 숫자들이 10만 보다 작거나 같다고 했으니, 

bool canMake[20*100000+10];

다음과 같은 구조를 만들어 dfs를 수의 갯수 깊이만큼 갔을 때, 만들 수 있는지 없는지를 저장하면서 문제를 해결 하면 됩니다. 

 

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

#include <iostream>

using namespace std;

int N;
int intArray[25];
bool canMake[20*100000+10];

void dfs(int curStep, int curVal){
    // when will it end?
    if(curStep == N){
        canMake[curVal] |= 1;
        return;
    }
    // o select
    dfs(curStep+1, curVal+intArray[curStep]);
    // x select
    dfs(curStep+1, curVal);
}

int main(){
    cin >> N;
    for(int i = 0; i<N; i++){
        cin >> intArray[i];
    }
    
    // fill canMake array
    dfs(0, 0);
    // get answer
    for(int i = 1; ;i++){
        if(!canMake[i]){
            cout << i << endl;
            break;
        }
    }

    return 0;
}

 

반응형

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

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

    티스토리툴바