본문 바로가기

알고리즘 공부 및 문제 풀이/백준(BOJ)

[c++] 백준 15650, 15651, 15652 N과 M (2), (3), (4)

백준 단계별로 풀어보기 [백트래킹] N과 M (2), (3), (4)

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

 

15650번: N과 M (2)

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

www.acmicpc.net

 

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

 

15651번: N과 M (3)

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

www.acmicpc.net

 

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

 

15652번: N과 M (4)

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

www.acmicpc.net

 

[풀이]

(2). (1)이 순열을 출력하는 문제였다면, (2)는 조합을 출력하는 문제이다. (1, 2)와 (2, 1)을 구분해야하므로 num을 전달해서 반복문이 이전 값을 고려하지 않도록 해준다.

(3). 같은 수를 여러번 골라도 되기때문에 방문했는지 여부를 체크하지 않는다.

(4). (2)와 (3)의 조건을 모두 포함한다.

 

[코드]

(2) 조합 출력

#include <iostream>
#include <algorithm>
#define MAX 9

int n, m;
bool visited[MAX] = { false, };
int list[MAX];

void dfs(int num, int count) {
	if (count == m) {
		for (int i = 0; i < m; i++) {
			std::cout << list[i]+1 << " ";
		}
		std::cout << "\n";
		return;
	}

	for (int i = num; i < n; i++) {
		if (!visited[i]) { 
			visited[i] = true;
			list[count] = i;
			dfs(i+1, count+1);
			visited[i] = false; 
		}
	}

}

int main() {
	std::cin >> n >> m;
	dfs(0, 0);

	return 0;
}

(3) 자기 자신 포함

#include <iostream>
#include <algorithm>
#define MAX 9

int n, m;
bool visited[MAX] = { false, };
int list[MAX];

void dfs(int count) {
	if (count == m) {
		for (int i = 0; i < m; i++) {
			std::cout << list[i] << " ";
		}
		std::cout << "\n";
		return;
	}

	for (int i = 1; i <= n; i++) {
		list[count] = i;
		dfs(count+1);
	}

}

int main() {
	//자기 자신도 출력
	std::cin >> n >> m;
	dfs(0);

	return 0;
}

(4) 자기 자신 포함 + 비내림차순

#include <iostream>
#include <algorithm>
#define MAX 9

int n, m;
bool visited[MAX] = { false, };
int list[MAX];

void dfs(int num, int count) {
	if (count == m) {
		for (int i = 0; i < m; i++) {
			std::cout << list[i]+1 << " ";
		}
		std::cout << "\n";
		return;
	}

	for (int i = num; i < n; i++) {
		list[count] = i;
		dfs(i, count+1);
	}

}

int main() {
	//자기 자신을 출력하되, 비내림차순으로.
	std::cin >> n >> m;
	dfs(0, 0);

	return 0;
}

'알고리즘 공부 및 문제 풀이 > 백준(BOJ)' 카테고리의 다른 글

[c++] 백준 1037 약수  (0) 2021.07.21
[c++] 백준 5086 배수와 약수  (0) 2021.07.21
[c++] 백준 15649 N과 M (1)  (0) 2021.07.20
[c++] 백준 11047 동전 0  (0) 2021.07.20
[c++] 백준 11399 ATM  (0) 2021.07.19