백준 15663번 : N과 M(9)

M1ndCon·2024년 7월 16일
0

Algorithm

목록 보기
29/32

  • Solved.ac 기준 : 실버 2
  • 사용언어 C++

문제 해석 및 풀이

  • 백트래킹 기법을 이용해 답을 출력
  • 같은 수가 들어 있을 때 이 수들은 같은 수 이면서 같은 수가 아님
  • visited를 사용해 해당 수를 사용했는지 여부 판별할 것
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

void backtracking(vector<int>& arr, vector<int>& lst, int m, vector<vector<int>>& res, vector<bool>& visited) {
    if (lst.size() == m) {
        res.push_back(lst);
        return;
    }

    for (int i = 0; i < arr.size(); i++) {
        if (!visited[i]) {
            visited[i] = true;
            lst.push_back(arr[i]);
            backtracking(arr, lst, m, res, visited);
            lst.pop_back();
            visited[i] = false;
        }
    }
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    int n, m;
    cin >> n >> m;
    vector<int> arr(n);

    for (int i = 0; i < n; i++) {
        cin >> arr[i];
    }

    sort(arr.begin(), arr.end());

    vector<int> lst;
    vector<vector<int>> res;
    vector<bool> visited(n, false);

    backtracking(arr, lst, m, res, visited);

    sort(res.begin(), res.end());
    res.erase(unique(res.begin(), res.end()), res.end());

    for (const auto& r : res) {
        for (int num : r) {
            cout << num << " ";
        }
        cout << "\n";
    }

    return 0;
}
profile
게임 개발자 지망생

0개의 댓글