문제 풀이/BOJ 문제 풀이

[BOJ알고리즘, C++]#15650_N과 M(2), 백 트래킹, 조합

Hardii2 2023. 7. 27. 20:59

 

[BOJ알고리즘, C++]#15650_N과 M(2)

 

BOJ 알고리즘 문제 풀이, 15650문제 N과 M(2)

 조합 문제를 백 트래킹을 활용해 해결하는 방법에 대해 알아보겠습니다.

 


 

Overview

 

  1. 문제
  2. 풀이
  3. 코드

 

#0. 문제

 

#1. 풀이

1. 백 트래킹

// 링크

 

  • 조합 문제는 백 트래킹 알고리즘을 활용하는 대표적인 문제 중 하나입니다.
  • 백 트래킹 알고리즘은 문제 해결을 위해 여러 후보 해결책들을 점진적으로 탐색하며, 현재 선택한 경로가 해결책으로 이어질 수 없다고 판단되면, 이전 단계로 돌아가 다른 경로에 대한 탐색을 시도하는 알고리즘입니다. 이를 통해, 효율적으로 문제의 모든 가능한 후보 해결책들을 탐색할 수 있습니다.

 

2. 조합

 

[확률과 통계]#2 조합, nCr

[확률과 통계]#2 조합, nCr 확률과 통계 과목의 "순열과 조합"에 대해 공부합니다. Overview 조합과 순열의 차이점 조합의 성질 같은 것이 있는 순열 vs 조합 중복 조합 조합과 순열의 차이점 1. 조합? D

webddevys.tistory.com

 

  • 조합(nCm)은 서로 다른 n개 중에서 순서 상관없이 m개를 선택하는 것입니다.
  • 이때, 우리가 주목할 점은 "순서"입니다. 조합의 경우, "1, 2"와 "2, 1"은 동일한 경우로 취급합니다.

 

#2. 코드

1. 코드 

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

int N, M;
vector<int> ans;

void dfs(int depth, int start)
{
    if(depth == M)
    {
        for(int i=0 ;i<M; i++)
        {
            cout << ans[i] << ' ';   
        }
        cout << '\n';
        return;
    }
    for(int i=start; i<=N; i++)
    {
        ans.push_back(i);
        dfs(depth+1, i+1);
        ans.pop_back();
    }
}

int main()
{
    ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    
    cin >> N >> M;   
    dfs(0, 1);
    
    return 0;
}