본문 바로가기
알고리즘

백준 s3 15650 N과 M (2) c++

by kyj0032 2024. 1. 15.

https://acmicpc.net/problem/15650

 

15650번: N과 M (2)

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

www.acmicpc.net

 

코드 - 재귀로 푼 버전

/*boj s3 15650 N과 M (2)*/
#include <iostream>
#define MAXN 9
using namespace std;

int N, M;
int answer[MAXN];

void func(int k, int i) { // i부터 시작
    if (k == M) {
        for (int i = 0; i < M; i++) {
            cout << answer[i] << " ";
        }
        cout << '\n';
        return;
    }

    for (int j = i; j <= N; j++) {
        answer[k] = j;
        func(k + 1, j + 1);
    }
}

int main(void) {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> N >> M;

    func(0, 1);
}

 

 

코드 - next_permutation으로 푼 버전

/*boj s3 15650 N과 M (2) next_perm*/
#include <algorithm>
#include <iostream>
#include <vector>
#define MAXN 105
using namespace std;

int N, M;
vector<int> choice;
int main(void) {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> N >> M;

    for (int i = 0; i < N; i++) {
        if (i < M)
            choice.push_back(0);
        else
            choice.push_back(1);
    }

    do {
        for (int i = 0; i < N; i++) {
            if (choice[i] == 0)
                cout << i + 1 << " ";
        }
        cout << "\n";
    } while (next_permutation(choice.begin(), choice.end()));
}

 

 

next_permutation

오름차순으로 정렬되어 있을 때, 조합을 구해준다.

N개 중 M개를 택하려면, {0, 0, 0, 1, 1} 조합으로 5개 중 3개를 택하는 조합을 구할 수 있다.

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

백준 s3 15652 N과 M (4) c++  (0) 2024.01.15
백준 s3 15651 N과 M (3) c++  (0) 2024.01.15
백준 s2 1182 부분수열의 합 c++  (0) 2024.01.15
백준 g4 9663 N-Queen c++  (0) 2024.01.15
백준 s3 15649 N과 M (1) c++  (0) 2024.01.15