728x90
반응형

블로그에 올리는 모든 문제 풀이는 깃허브에 올려져 있습니다.


문제 설명

  • 자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.
    1. 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열 (1 <=M <=N <=8)
    2. 오름차순

풀이 전략

  • dfs를 활용한 조합 문제이다.
  • for문의 i값을 재귀 함수의 인자로 넘겨주면 앞에서 이미 찾은 조합은 다시 뽑지 않도록 만들 수 있다.
  • 중복이 없으므로 뒤의 숫자는 무조건 앞의 숫자보다 크다.

소스 코드

#include <iostream>

int arr[9] = { 0, };
bool visited[9] = { false, };

using namespace std;
void Dfs( int num, int cnt, int n, int m )
{
	if( cnt == m )
	{
		for (int i = 0; i < m; i++)
			cout << arr[i] << ' ';

		cout << '\n';
		return;
	}

	for (int i = num; i <= n; i++)
	{
		if (!visited[i])
		{
			visited[i] = true;
			arr[cnt] = i;
			Dfs(i + 1, cnt + 1, n, m);
			visited[i] = false;
		}
	}
}

int main()
{
	int n, m;
	cin >> n >> m;
	Dfs(1, 0, n, m);
}

링크

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

 

15650번: N과 M (2)

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

www.acmicpc.net

 

728x90
반응형

'문제풀이 > BOJ' 카테고리의 다른 글

[C++ 백준] 15652 N과 M (4)  (0) 2021.12.12
[C++ 백준] 1932 정수 삼각형  (0) 2021.11.22
[C++ 백준] 2108 통계학  (0) 2021.10.04
[C++ 백준] 1181 단어 정렬  (0) 2021.08.26
[C++ 백준] 18870 좌표 압축  (0) 2021.08.18