#BOJ 15650 N과 M(2)

Wonder_Why (Today I learned)·2022년 1월 22일
0

BOJ

목록 보기
41/70

N과 M (2)

시간 제한	메모리 제한	제출	정답	맞힌 사람	정답 비율
1 초	512 MB	33644	25243	18412	74.609%

문제
자연수 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

코드

/*
BOJ : https://www.acmicpc.net/problem/15650
backtracking N과 M(2)
Versatile0010
*/

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

int n, m; // 1~n 까지의 자연수 중 중복없이 m 개를 고른다.
bool isused[10];  // 특정 수가 사용되었는지 확인하기 위함
int arr[10]; // 완성된 수열을 차례대로 담기 위함


void solve(int k)
{
	if (k == m) // 원하는 길이의 수열을 만들었다면 출력하고 해당함수 종료
	{
		for (int i = 0; i < m; i++)
			cout << arr[i] << ' ';
		cout << '\n';
		return;
	}
	else
	{
		int start = 1;
		if (k != 0) start = arr[k - 1] + 1;
		for (int i = start; i <= n; i ++ )
		{
			if (!isused[i]) // 해당 수를 사용하지 않았다면?
			{
				arr[k] = i;
				isused[i] = true;
				solve(k + 1);
				isused[i] = false;
			}
		}
	}

}

int main()
{
	ios::sync_with_stdio(0); cin.tie(0);

	cin >> n >> m;

	solve(0);
	return 0;

	return 0;
}

GIT: https://github.com/versatile0010/PS/blob/main/Backtracking/BOJ15650_N%EA%B3%BCM(2).cpp

profile
전자과 머학생

0개의 댓글