[백준] 백트래킹 15650번: N과 M (2)

C.K. ·2022년 7월 21일
0

baekjoon

목록 보기
67/67

문제

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

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

입력

첫째 줄에 자연수 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8)

출력

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

수열은 사전 순으로 증가하는 순서로 출력해야 한다.

Approach

  • 1번문제와 동일하되 오름차순인 수열만 출력해야하기 때문에 인수 한개를 더 만들어서 이 전에 사용한 수보다 큰 수들만 다음 수로 쓰게끔 한다 (i를 사용했으면 i+1부터 사용가능)

Source Code

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

vector<int> v(10, 0);
vector<bool> visited(10, false);

void solve(int index, int start, int& n, int& m)
{
    if (index == m) // m길이가 되면 출력
    {
        for (int i = 0; i < m; i++)
        {
            cout << v[i] << ' ';
        }
        cout << '\n';
    }
    
    for (int i = start; i <= n; i++)
    {
        if (visited[i])
            continue;

        visited[i] = true;
        v[index] = i;
       

        solve(index + 1, i + 1, n, m);
        visited[i] = false;

    }
}

int main() {
    
    int n, m;
    cin >> n >> m;
    
    solve(0, 1, n, m);
    
    
}
profile
1일 1알고리즘

0개의 댓글