알고리즘 문제 해결/BOJ

[백 트래킹] BOJ 15663 N과 M(9)

jmkimmessi 2021. 8. 18. 00:00
반응형

www.acmicpc.net/problem/15663

 

15663번: N과 M (9)

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

www.acmicpc.net

 

문제 해결 알고리즘

 

해쉬맵과 dfs를 이용해서 푸는 백 트래킹 문제였다. 약간 스킬이 조금 필요한 문제였던 것 같다.

 

소스 코드

 

#include <bits/stdc++.h>
using namespace std;

int N, M;
vector<int> v;
map<int, int> numberCnt;
int visited[9];

void dfs(int cnt, int idx){

  if(M == cnt){
    for(int i=0;i<M;i++){
      cout << v[visited[i]] << ' ';
    }
    cout << '\n';

    return;
  }

  if(N == idx) return;

  for(int i=0;i<v.size();i++){
    if(numberCnt[v[i]] > 0){
      numberCnt[v[i]]--;

      visited[idx] = i;
      
      dfs(idx+1, cnt+1);

      numberCnt[v[i]]++;
    }
  }
} 

int main(){

  cin >> N >> M;
  
  for(int i=0;i<N;i++){
     int num; cin >> num;

     if(!numberCnt.count(num)){
       numberCnt[num] = 1;
       v.push_back(num);
     }
     else numberCnt[num]++;

    
  }

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

  dfs(0, 0);
}
반응형

'알고리즘 문제 해결 > BOJ' 카테고리의 다른 글

[브루트 포스] BOJ 7568 덩치  (0) 2021.08.31
[DP] BOJ 2579 계단 오르기  (0) 2021.08.22
[BFS] BOJ 9019 DSLR  (0) 2021.08.11
[브루트 포스] BOJ 3684 어려운 문제  (0) 2021.07.23
[그리디] BOJ 1461 도서관  (0) 2021.07.13