N과 M 수열 문제 시리즈를 하나의 포스트에 정리하려 한다.

수열을 출력하는데, 중복 숫자의 뒤집힌 수열을 포함하는지에 따라 구현 방법이 달라진다.

 

BOJ 15649 N과 M (1)

자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.

  • 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열

 

 

이 문제는 같은 숫자의 뒤집힌 수열을 포함한다(ex: 1 4,  4 1)

재귀함수를 이용해 백트래킹으로 1~N 까지 숫자를 순차적으로 M개 출력하여 풀 수 있다.

 

N과 M(1) 소스코드

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include<stdio.h>
#include<vector>
using namespace std;
 
int n,m;
bool nums[10];
void solve(vector<int>& v){
    if(v.size() == m) {
        for(int i=0;i<v.size();i++){
            printf("%d ",v[i]);
        }
        printf("\n");
        return;
    }
 
    for(int i=1;i<=n;i++){
        if(!nums[i]){
            v.push_back(i);
            nums[i] = 1;
            solve(v);
            nums[i] = 0;
            v.pop_back();
        }
    }
}
int main(){
    scanf("%d%d",&n,&m);
    vector<int>v;
    solve(v);
    return 0;
}
cs

 

 

 

 

BOJ 15650 N과 M (2)

자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.

  • 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열
  • 고른 수열은 오름차순이어야 한다.

 

 

이 문제는 같은 숫자의 뒤집힌 수열을 포함하지 않는다. 한 번 나온 숫자의 조합은 한 번만 출력된다.

이런 문제는 순열로 풀 수 있다.

1
2
3
4
5
6
#include<algorithm>
 
std::vector<bool> v;   // 0 1 0 1
...
std::prev_permutation( v.begin(), v.end() ); // 0 0 1 1
std::next_permutation( v.begin(), v.end() ); // 0 1 1 0
cs

 

 

 

N과 M (2) 소스코드

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<stdio.h>
#include<vector>
#include<algorithm>
using namespace std;
 
int n,m;
 
int main(){
    scanf("%d%d",&n,&m);
    
    vector<bool> v(n);
    fill(v.begin(), v.begin()+m, 1);
    
    do {
        for(int i=0; i<v.size(); i++){
            if(v[i])
                printf("%d ",i+1);
        }
        printf("\n");
    } while( prev_permutation(v.begin(), v.end()) );
    return 0;
}
cs

 

 

'알고리즘 문제풀이' 카테고리의 다른 글

BOJ 4811 알약  (0) 2020.08.28
BOJ 12865 평범한 배낭  (0) 2020.08.28
BOJ 2580 스도쿠  (0) 2020.08.20
BOJ 1194 달이 차오른다, 가자.  (0) 2020.08.11
BOJ 6087 레이저통신  (0) 2020.08.09

+ Recent posts