넘치게 채우기

[BOJ] 15654 - N과 M(5) 본문

PS/BOJ

[BOJ] 15654 - N과 M(5)

riveroverflow 2024. 10. 24. 10:50
728x90
반응형

https://www.acmicpc.net/problem/15654

BOJ - N과 M(5)

문제 유형: 백트래킹, dfs, 재귀

문제 난이도: Silver III

시간 제한: 1초

메모리 제한: 512MB

 

문제

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

  • N개의 자연수 중에서 M개를 고른 수열

 

입력

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

둘째 줄에 N개의 수가 주어진다. 입력으로 주어지는 수는 10,000보다 작거나 같은 자연수이다.

 

출력

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

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

 

풀이

우선, 입력받은 N개의 수를 정렬해준다.

그리고, 다음의 재귀를 호출한다: solve(seq, arr);

 base case: 만약 seq의 요소가 m개라면, 수열을 하나 완성한 것이므로 출력한다.

 아니라면, 새로 추가해보자. i부터 n까지 다음을 시도한다:

  만약 현재 seq에 arr[i]가 없으면, seq에 넣어보고 solve를 호출한 뒤, 도로 뺀다.

 

코드

C++

#include <bits/stdc++.h>

using namespace std;

int n, m;

void solve(vector<int> &seq, vector<int> &arr) {
  if (seq.size() == m) {
    for (const auto &element : seq) {
      cout << element << " ";
    }
    cout << "\n";
    return;
  }

  for (int i = 0; i < n; ++i) {

    if (find(seq.begin(), seq.end(), arr[i]) == seq.end()) {
      seq.emplace_back(arr[i]);
      solve(seq, arr);
      seq.pop_back();
    }
  }
}

int main(int argc, char *argv[]) {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);

  cin >> n >> m;

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

  sort(arr.begin(), arr.end());
  vector<int> seq;
  solve(seq, arr);

  return 0;
}
728x90
반응형

'PS > BOJ' 카테고리의 다른 글

[BOJ] 16953 - A → B  (0) 2024.10.25
[BOJ] 15663 - N과 M(9)  (0) 2024.10.25
[BOJ] 15652: N과 M(4)  (0) 2024.10.23
[BOJ] 11725 - 트리의 부모 찾기  (0) 2024.10.22
[BOJ] 11053: 가장 긴 증가하는 부분 수열  (0) 2024.10.21