넘치게 채우기

[BOJ] 15663 - N과 M(9) 본문

PS/BOJ

[BOJ] 15663 - N과 M(9)

riveroverflow 2024. 10. 25. 11:52
728x90
반응형

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

BOJ - N과 M(9)

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

문제 난이도: Silver II

시간 제한: 1초

메모리 제한: 512MB

 

문제

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

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

 

입력

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

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

 

출력

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

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

 

풀이

중복을 구분하기 위해서, 수열에 인덱스를 담아서 계산했다. 그리고, 같은 값을 호출하는 것을 방지하기 위해, 보낸 적 있는가에 대해서도 추적했다.

크기가 m이면 출력 후 탈출하고, 그렇지 않으면, 현재 수열에 없는 요소이고 이번 재귀에서 쓴 적 없는 숫자라면, 백트래킹으로 호출한다.

 

입력 수들을 미리 정렬해놓자.

 

코드

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 << arr[element] << " ";
    }
    cout << endl;
    return;
  }
  unordered_map<int, int> mp;
  for (int i = 0; i < n; ++i) {
    if (find(seq.begin(), seq.end(), i) == seq.end() && mp[arr[i]] == 0) {
      mp[arr[i]] = 1;
      seq.push_back(i);
      solve(seq, arr);
      seq.pop_back();
    }
  }
}

int main(int argc, char *argv[]) {
  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] 1149 - RGB거리  (0) 2024.10.26
[BOJ] 16953 - A → B  (0) 2024.10.25
[BOJ] 15654 - N과 M(5)  (0) 2024.10.24
[BOJ] 15652: N과 M(4)  (0) 2024.10.23
[BOJ] 11725 - 트리의 부모 찾기  (0) 2024.10.22