작심 24/7

[백준] 2309번 일곱 난쟁이 본문

백준

[백준] 2309번 일곱 난쟁이

모닝수박 2020. 6. 7. 16:56
 

2309번: 일곱 난쟁이

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

www.acmicpc.net

9명 중에 순서 상관없고 중복 없이 7명을 찾아내는 것이므로 조합이다.

조합 함수를 만들어서 재귀로 풀어주면 된다.

 

결과 벡터에 있는 값 < 현재 배열에 있는 값인 경우에만

push와 카운트, sum에 더해주고 재귀호출 해주며 카운트가 7이 될 때까지 반복한다.

 

카운트가 7이고 sum이 100이면 출려해주고 끝내고

아닐 경우엔 돌아와서 pop, 카운트와 sum에서도 빼준 뒤

다음 배열의 값으로 넘어간다.

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int cnt = 0, sum = 0, finish = 0;
vector <int> res;
void combination(int dwarf[]) {
	if (cnt == 7) {
		if (sum == 100) {
			for (int i = 0; i < 7; i++) cout << res[i] << "\n";
			finish = 1;
		}
		return;
	}
	else {
		for (int i = 0; i < 9; i++) {
			if (finish == 1) return;
			if (res.empty() || res.back() < dwarf[i]) {
				res.push_back(dwarf[i]);
				cnt++;
				sum += dwarf[i];
				combination(dwarf);
				res.pop_back();
				sum -= dwarf[i];
				cnt--;
			}
		}
	}
}

int main() {
	int dwarf[10] = { 0 };
	for (int i = 0; i < 9; i++) cin >> dwarf[i];
	sort(dwarf, dwarf + 9);
	combination(dwarf);
	return 0;
}

'백준' 카테고리의 다른 글

[백준] 2503번 숫자 야구 (C++, JAVA)  (0) 2020.06.08
[백준] 10448번 유레카 이론  (0) 2020.06.07
[백준] 1912번 연속합  (0) 2020.06.07
[백준] 1406번 에디터  (0) 2020.06.06
[백준] 5076번 Web Pages  (0) 2020.06.05
Comments