BOJ/재귀

[C/C++] 백준 - 2309번 : 일곱 난쟁이

JWonK 2021. 9. 6. 12:33
728x90
반응형

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

 

2309번: 일곱 난쟁이

아홉 개의 줄에 걸쳐 난쟁이들의 키가 주어진다. 주어지는 키는 100을 넘지 않는 자연수이며, 아홉 난쟁이의 키는 모두 다르며, 가능한 정답이 여러 가지인 경우에는 아무거나 출력한다.

www.acmicpc.net

이 문제는 9명 중 7명을 뽑았을 때, 그 7명 키의 합이 100인 경우 정렬한 후 출력해주면 끝나는 문제이다.

n명 중 m명을 뽑는 알고리즘을 설계해서 해결해주었다.

bool visited[10];
int od[10];
int nanj[10];
#include <iostream>
#include <queue>
#include <vector>
#include <stack>
#include <string>
#include <cstring>
#include <map>
#include <algorithm>
#define ll long long
#define INF 987654321
#define CUNLINK ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define MAX 100000 + 1
#define endl '\n'

using namespace std;

void func(int depth, int start) {
	if (depth == 7) {
		int total = 0;
		for (int i = 0; i < 7; i++) {
			total += nanj[i];
		}
		if (total == 100) {
			sort(nanj, nanj + 7);
			for (int i = 0; i < 7; i++) cout << nanj[i] << endl;
			exit(0);
		}
		return;
	}

	for (int i = start; i < 9; i++) {
		if (!visited[i]) {
			visited[i] = true;
			nanj[depth] = od[i];

			func(depth + 1, i + 1);

			visited[i] = false;
		}
	}
}


int main() {
	CUNLINK;
	for (int i = 0; i < 9; i++) cin >> od[i];
	func(0, 0);
	
	return 0;
}
728x90
반응형