HANCO

백준 N과M(2) 본문

Algorithm/N과M

백준 N과M(2)

HANCO 2020. 3. 1. 13:10

N과M(2) 문제는 자칫 1번 문제와 매우 유사해 보일 수 있다.

하지만 차이점은 기존 solve(idx, cnt+1)을 이용해 재귀를 돌린 것과 다르게 solve(i, cnt+1)을 이용해 재귀를 돌린다.

첫번째 코드에서는 idx는 한 분기가 끝나고 증가는 재귀문이기 때문에 1과의 조합을 전부 선택한후 2와의 조합들을 선택하지만

두번째 코드는 i의 값으로 인자를 받기때문에 (1, 2), (1, 3), (1, 4) 이후에 (2, 1)이 아니라 무조건 뒤 숫자가 앞 숫자보다 큰 (2, 3)이 나오게 된다.


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

  int N, M;
  int arr[8];
  vector<int> v;
  bool sel[8];

  void solve(int idx, int cnt){
    if(cnt == M){
      for(int i=0;i<M;i++){
        cout << v[i] << " ";
      }
      cout << '\n';
      return;
    }
    for(int i=idx;i<N;i++){
      if(sel[i] == true) continue;

      sel[i] = true;
      v.push_back(arr[i]);
      solve(i, cnt+1);
      v.pop_back();
      sel[i] = false;
    }
  }
  int main(){
    cin >> N >> M;
    for(int i=1;i<=N;i++){
      arr[i-1] = i;
    }
    solve(0, 0);
  }

'Algorithm > N과M' 카테고리의 다른 글

백준 N과M(1)  (0) 2020.03.01