알고리즘/BaekJoon

백준 15665 : N과 M(11)

꾸준하게 :) 2020. 3. 11. 20:25

문제 링크입니다 https://www.acmicpc.net/problem/15665

 

15665번: N과 M (11)

한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해야 한다.

www.acmicpc.net

N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 문제였습니다. 주어지는 N개의 자연수 중 같은 수가 있을 수도 있습니다. 조건은 다음과 같고,

 

  • N개의 자연수 중에서 M개를 고른 수열
  • 같은 수를 여러 번 골라도 된다.

'15664번 N과 M(10)' 문제(https://seokeeee.tistory.com/152)에서 중복된 수를 고르지 않기 위한 코드만 수정해주면 되는 문제였습니다. 중복되는 수열을 또 출력하면 안되는 조건은 동일했습니다.

 

 

[소스코드]

 

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
33
34
35
36
37
38
39
40
41
42
43
44
#include<algorithm>
#include<iostream>
using namespace std;
 
int n, m, num[8], result[8];
 
// 입력받은 n개의 수들 중에서 골랐던 수열과 똑같은 수열을
// 고르지 않게 m개를 고르고 출력해주는 함수
void getResult(int count) {
 
    // m개를 골랐다면 출력합니다
    if (count == m) {
        for (int i = 0; i < m; i++)
            cout << result[i] << ' ';
        cout << '\n';
        return;
    }
    int prev_num = -1// 바로 직전에 골랐던 수를 저장하는 변수
    
    for (int i = 0; i < n; i++) {
 
        // 중복되는 수열을 출력하지 않기위해 바로 직전에
        // 골랐던 수를 고르지 않게 합니다.
        if (prev_num != num[i]) {
            result[count] = num[i];
            prev_num = num[i];
            getResult(count + 1);
        }
    }
}
 
int main(void) {
 
    cin >> n >> m;
    for (int i = 0; i < n; i++)
        cin >> num[i];
 
    // 수열은 사전 순으로 출력해야 하므로
    // 입력을 받고 오름차순으로 정렬합니다
    sort(num, num + n);
 
    getResult(0);
    return 0;
}
cs

 

'알고리즘 > BaekJoon' 카테고리의 다른 글

백준 1181 : 단어 정렬  (0) 2020.03.15
백준 15666 : N과 M(12)  (0) 2020.03.14
백준 15664 : N과 M(10)  (0) 2020.03.11
백준 15663 : N과 M(9)  (0) 2020.03.11
백준 15657 : N과 M(8)  (0) 2020.03.11