알고리즘

[C++] Boj 15656 N 과 M (7)

(ꐦ •᷄ࡇ•᷅) 2025. 1. 23. 09:01

문제 링크

15656 N과 M (7)

 

접근

N개의 수 중에서 M개를 뽑아 만들 수 있는 수열을 모두 만드는 문제이다. 이때, 같은 수를 여러 번 골라도 되지만 순서는 달라야 한다.

 

따라서 백트래킹을 이용해 모든 경우의 수를 찾아 주었다. 그리고 사전순으로 출력해야 하기 때문에 사전에 배열을 sort 해 주었다.

 

코드

#include <iostream>
#include <algorithm>
using namespace std;

// N개 중에서, M개 뽑음
int N, M;

// n번째로 뽑은 수를 저장
int picked[10];

// 숫자 모음
int numbers[10];

// k 번째로 저장할 수를 탐색 
void Solve(int k)
{
    if (k == M)
    {
        for (int i = 0; i < M; i++)
            cout << picked[i] << ' ';
        cout << '\n';
        return;
    }

    for (int i = 0; i < N; i++)
    {
        picked[k] = numbers[i];
        Solve(k + 1);
    }
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    cin >> N >> M;
    for (int i = 0; i < N; i++)
        cin >> numbers[i];
   
    // 사전순으로 찾기 위해 배열을 정렬
    sort(numbers, numbers + N);

    Solve(0);

    return 0;
}