Algorithm/BOJ

[백준 알고리즘/BOJ/C++] 15649 N과 M (1)

pinevienna 2021. 1. 30. 14:55

 

 

자연수 N과 M이 주어졌을 때, 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열을 출력하는 문제

 

N=3, M=1 일 때

1

2

3

 

N-4, M=2 일 때

1 2

1 3

1 4

2 1

2 3

2 4

3 1

3 2

3 4

4 1

4 2

4 3

 

이렇게 출력하면 된다

 

백트래킹은 조건에 만족할 경우 모든 경우의 수를 살펴보는 것 이라고 한다

N과 M (1)에선 중복이 아닐 경우(조건) 모두 출력한다 정도로 생각하면 될 것 같다

 

 

수열을 저장할 배열과 중복인지 체크할 배열을 각각 만들었다

배열에 저장한 수가 M개면 출력하고, 아니라면 중복인지 체크해서 배열에 수를 넣어주면 된다

 

 

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
32
#include <iostream>
using namespace std;
 
int n, m;
int arr[10];
bool isused[10];
 
void func(int k) {
    if (k == m) { //M개의 수 출력
        for (int i = 0; i < m; i++)
            cout << arr[i] << ' ';
        cout << '\n';
        return;
    }
 
    for (int i = 1; i <= n; i++) {
        if (!isused[i]) {
            arr[k] = i;
            isused[i] = 1;
            func(k + 1);
            isused[i] = 0;
        }
    }
}
 
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
 
    cin >> n >> m;
    func(0);
}
cs

 

arr는 수열을 저장할 배열, isused는 중복을 체크하는 배열

 

백트래킹의 기본이라는데 어려웠던 기억ㅎㅎ..