[코딩 테스트] Backtracking > N과 M (3)

Cassis_Soda·2025년 3월 17일

코딩 테스트

목록 보기
9/13
post-thumbnail

0. 링크

     백준 문제 링크

1. 설명

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

  • 1부터 N까지 자연수 중에서 M개를 고른 수열
  • 같은 수를 여러 번 골라도 된다.
  • 입력

    첫째 줄에 자연수 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 7)

  • 출력

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

입출력 예시

inputoutput
3 11
2
3
4 21 1
1 2
1 3
1 4
2 1
2 2
2 3
2 4
3 1
3 2
3 3
3 4
4 1
4 2
4 3
4 4

2. 해설

  1. M개의 수를 갖는 순열을 만들기 위한 list 벡터 선언
  2. Backtracking()함수 내에서 아래와 같이 반복한다.

    1) list.size() == m 이면 return후 출력
    2) i = 1; i <= N인 동안 다음을 반복한다.

    (1) list.push_back()
    (2) Backtracking()
    (3) list.pop_back()

3. 코드

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

int n,m;

vector <int> list;

void print()
{
    for(int i = 0; i < list.size(); i++)
    {
        cout << list[i] << " ";
    }
    cout << "\n";
}

// m개로 이루어진 중복조합
void Backtracking()
{
    if (list.size() == m)
    {
        print();
        return;
    }
    
    for(int i = 1; i <= n; i++)
    {
        list.push_back(i);
        Backtracking();
        list.pop_back();
    }
}

int main()
{
    cin >> n >> m;
    Backtracking();
    
}

4. 감상

     스터디에서 푼 마지막 문제. 사실 제일 처음 푼 문제지만, 문제 번호가 3번이라 나중에 적는다. 모든 조합을 검토하는 백트래킹의 가장 기본이 되는 문제되겠다. 참고가 될진 모르겠지만 1번2번을 다시 보며 차이를 이해하자.

0개의 댓글