백준 N과 M (3),(4) [c++]
N과M 3,4 실버 3
N과M 3
자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.
1부터 N까지 자연수 중에서 M개를 고른 수열 같은 수를 여러 번 골라도 된다.
N과M 4
자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.
1부터 N까지 자연수 중에서 M개를 고른 수열 같은 수를 여러 번 골라도 된다. 고른 수열은 비내림차순이어야 한다. 길이가 K인 수열 A가 A1 ≤ A2 ≤ … ≤ AK-1 ≤ AK를 만족하면, 비내림차순이라고 한다.
풀이
- 이전 N과M1,2와 유사한 문제인데 3은 중복허용, 4는 중복허용 + 비내림차순 출력이었다.
- 조건에 맞게 promising을 수정하니 쉽게 해결
코드
NM 3
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
queue <vector<int> > q;
int n, m;
void promising(vector<int> v)
{
int size = v.size();
if(size == m){
//print & return;
for(int i = 0; i < m; i++)
{
cout << v[i] << " ";
}
cout << "\n";
return;
}
for(int i = 1; i <= n; i++)
{
// int varified = 1;
// for(int s = 0; s < size; s++){
// if(v[s] == i){
// varified = 0;
// }
// }
// if(varified == 1){
// vector<int> add(v);
// add.push_back(i);
// q.push(add);
// }
vector<int> add(v);
add.push_back(i);
q.push(add);
}
}
int main(){
cin >> n >> m;
for(int i = 1; i <= n; i++)
{
vector<int> v;
v.push_back(i);
q.push(v);
}
while(!q.empty()){
int qsize = q.size();
//cout << "q_size : " << qsize << endl;
for(int i = 0; i < qsize; i++)
{
vector<int> t = q.front();
q.pop();
promising(t);
}
}
return 0;
}
NM 4
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
queue <vector<int> > q;
int n, m;
void promising(vector<int> v)
{
int size = v.size();
if(size == m){
for(int i = 0; i < m; i++)
{
cout << v[i] << " ";
}
cout << "\n";
return;
}
for(int i = 1; i <= n; i++)
{
// int varified = 1;
// for(int s = 0; s < size; s++){
// if(v[s] == i){
// varified = 0;
// }
// if(v.back() > i){
// }
// }
// if(varified == 1){
// vector<int> add(v);
// add.push_back(i);
// q.push(add);
// }
if(v.back() <= i){
vector<int> add(v);
add.push_back(i);
q.push(add);
}
}
}
int main(){
cin >> n >> m;
for(int i = 1; i <= n; i++)
{
vector<int> v;
v.push_back(i);
q.push(v);
}
while(!q.empty()){
int qsize = q.size();
//cout << "q_size : " << qsize << endl;
for(int i = 0; i < qsize; i++)
{
vector<int> t = q.front();
q.pop();
promising(t);
}
}
return 0;
}
총평
- easy