알고리즘 문제/C++
[백준] 23057번 : 도전 숫자왕 - C++
lingk
2022. 4. 26. 17:42
문제
https://www.acmicpc.net/problem/23057
23057번: 도전 숫자왕
모든 카드에 적힌 수의 합을 $M$이라고 할 때, 1 이상 $M$ 이하의 자연수 중 만들 수 없는 수의 개수를 출력한다.
www.acmicpc.net
설명
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int card[21];
vector<int> vec;
int sum=0;
int N;
void DFS(int i, int num)
{
vec.push_back(num);
if(i == N) return;
DFS(i+1,num+card[i+1]);
DFS(i+1,num);
}
int main()
{
cin>>N;
for(int i = 0;i<N;i++)
{
cin >> card[i];
sum += card[i];
}
for(int i = 0;i<N;i++)
{
DFS(i, card[i]);
}
sort(vec.begin(), vec.end());
vec.erase(unique(vec.begin(), vec.end()), vec.end());
cout<<sum - vec.size();
}
이 문제에서는 우선, 입력받은 숫자카드로 만들 수 있는 숫자들을 구해야한다.
만들 수 있는 숫자의 개수는 DFS를 통해서 구했다.
첫번째 카드부터 DFS함수의 인자로 넣어주어 만들 수 있는 숫자들을 벡터 vec에 삽입해준다.
재귀 호출을 통해서, 다음 카드를 사용하는 경우와 다음 카드를 사용하지 않는 경우를 구해주었다.
erase와 unique를 사용하여 중복원소를 제거해준다.
카드의 합에서 vec사이즈를 빼면 원하는 출력값이 나온다.
반응형