본문 바로가기

문제 풀이/BOJ

[백준 15652] N과 M (4)

● 문제 : 백준 15652번 : N과 M (4)

 

15652번: N과 M (4)

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

www.acmicpc.net

 

 알고리즘

- 재귀함수

- 백트래킹

 

[백트래킹]

백트래킹이란 경로를 탐색하다가 올바르지 않은 경로라면 계속해서 탐색하는 것이 아니라 이전 단계로 돌아가 다시 올바른 경로를 향해 찾아가는 알고리즘이다. 모든 경로를 탐색하는 알고리

kinngife.tistory.com

 

 문제 풀이

백준 15650번 N과 M (2) 코드에서 조금만 수정하면 된다.

 

[백준 15650] N과 M (2)

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

kinngife.tistory.com

백준 15650번 N과 M (2) 문제가 중복을 허용하지 않는 조합을 구하는 것이라면, 이 문제는 중복을 허용하는 조합을 구하는 것이다. (1,1)과 같은 수열도 허용한다는 것이다. 따라서, 백트래킹을 위한 조건인 방문했는지를 검사하는 단계가 필요없어진다. 그러므로 N과 M (2) 코드에서 if (visit[i] == 0) 구문만 없애주고, 호출하는 재귀함수의 start에 해당하는 첫 번째 매개변수를 DFS(i, cnt + 1)로 바꿔주면 된다.

 

 코드

#include <iostream>
#include <vector>
#include <stack>
#include <queue>
#include <deque>
#include <map>
#include <algorithm>
#include <string>
#include <cstring>
#include <climits>
#include <random>
#include <cmath>
#include <set>
#include <ctime>
using namespace std;
using ll = long long;
using ii = pair<int, int>;

int N, M;
vector<int>arr;
vector<int>visit(9);
void DFS(int start, int cnt)
{
	if (cnt == M)
	{
		for (int i = 0; i < arr.size(); i++)
			cout << arr[i] << " ";
		cout << "\n";
		return;
	}

	for (int i = start; i <= N; i++)
	{
		visit[i] = 1;
		arr.push_back(i);
		DFS(i, cnt + 1);
		visit[i] = 0;
		arr.pop_back();
	}
}

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

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

[백준 2630] 색종이 만들기  (0) 2022.07.24
[백준 9663] N-Queen  (0) 2022.07.18
[백준 15651] N과 M (3)  (0) 2022.07.10
[백준 15650] N과 M (2)  (0) 2022.07.10
[백준 15649] N과 M (1)  (0) 2022.07.10