※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 1821번 문제인 수들의 합 6이다.
문제는 아래 링크를 확인하자.

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

 

1821번: 수들의 합 6

첫째 줄에 두개의 정수 N(1 ≤ N ≤ 10)과 F가 주어진다. N은 가장 윗줄에 있는 숫자의 개수를 의미하며 F는 가장 밑에 줄에 있는 수로 1,000,000 이하인 자연수이다.

www.acmicpc.net

수가 N개 있을 때, 수열의 k번째로 적힌 수(0-based index)는 최종 수에 각각 N-1 choose k번 더해지게 된다.

 

따라서, N개의 수를 사전순으로 나열해보면서(순열을 생성해보면서) 각 경우에 나오는 최종 수를 구해보는 것으로 문제를 해결할 수 있다. 이 때, 위의 관찰을 이용하면 이를 더욱 빠르게 진행할 수 있다.

 

아래는 제출한 소스코드이다.

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

vector<int> vec;

int N, F;
int comb[11][11];
bool visited[11];

int psum = 0;

bool func(int ith) {
	if (ith == N) {
		if (psum == F) {
			for (auto& x : vec) cout << x << ' ';
			return 1;
		}
	}
	else {
		for (int i = 1; i <= N; i++) {
			if (!visited[i]) {
				visited[i] = 1;
				vec.emplace_back(i);
				psum += i * comb[N - 1][ith];
				if (func(ith + 1)) return 1;
				psum -= i * comb[N - 1][ith];
				vec.pop_back();
				visited[i] = 0;
			}
		}
	}

	return 0;
}

void combinit() {
	for (int n = 0; n < 11; n++) {
		comb[n][0] = 1;
		for (int i = 1; i < n; i++) comb[n][i] = comb[n - 1][i - 1] + comb[n - 1][i];
		comb[n][n] = 1;
	}
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	combinit();

	cin >> N >> F;
	func(0);
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 25332 // C++] 수들의 합 8  (0) 2023.04.07
[BOJ 2268 // C++] 수들의 합 7  (0) 2023.04.06
[BOJ 2018 // C++] 수들의 합 5  (0) 2023.04.04
[BOJ 2015 // C++] 수들의 합 4  (0) 2023.04.03
[BOJ 2007 // C++] 수들의 합 3  (0) 2023.04.02

+ Recent posts