[BOJ] N과 M(2)

Sierra·2022년 7월 17일
0

[BOJ] BackTracking

목록 보기
2/8
post-thumbnail

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

문제

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

1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열
고른 수열은 오름차순이어야 한다.
입력
첫째 줄에 자연수 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8)

출력

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

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

예제 입출력

  • 예제 입력 1
3 1
  • 예제 출력 1
1
2
3
  • 예제 입력 2
4 2
  • 예제 출력 2
1 2
1 3
1 4
2 3
2 4
3 4
  • 예제 입력 3
4 4
  • 예제 출력 3
1 2 3 4

Solution

#include <iostream>
#define MAX 9
using namespace std;

int N, M;
int MATRIX[MAX];
bool visit[MAX];

void DFS(int num, int count){
    if(count == M){
        for(int i = 0; i < M; i++){
            cout << MATRIX[i] << " ";
        }
        cout << '\n';
        return;
    }
    for(int i = num; i <= N; i++){
        if(!visit[i]){
            visit[i] = true;
            MATRIX[count] = i;
            DFS(i+1, count + 1);
            visit[i] = false;
        }
    }
}

int main(){
    cin >> N >> M;
    DFS(1, 0);
}

이번에는 반드시 오름차순이어야 한다.
탐색하는 시점 자체를 바꾸면 그만이다.
https://www.acmicpc.net/problem/15649
이 문제에서는 모든 경우를 골라야 했다면 말이다.

for(int i = num; i <= N; i++){
    if(!visit[i]){
        visit[i] = true;
        MATRIX[count] = i;
        DFS(i+1, count + 1);
        visit[i] = false;
    }
}

탐색하고 있는 시점을 num 매개변수로 저장한다. 1번에서 시작했다면 다음 탐색 시점은 2번일테니 해당 값이 num에 저장 되어 있을 것이다.

원리는 똑같다. 단지 탐색 시점을 저장 한다는 차이가 있을 뿐.

profile
블로그 이전합니다 : https://swj-techblog.vercel.app/

0개의 댓글