[BaekJoon 11050][๐ค1] ์ดํญ ๊ณ์ 1
โ ๋ฌธ์
๐ฏ ๋์ด๋
Bronze ๐ค1
๐ง ํ์ด
1. ๋ด ํ์ด (์ดํญ ๊ณ์ - ํฉํ ๋ฆฌ์ผ)
- ์๊ณ ๋ฆฌ์ฆ
Combinatorics,Mathematics
- ์ค๋ช
ํฉํ ๋ฆฌ์ผ ์ํ ๊ธฐ๋ฒ์ ์ฌ์ฉํ ํ์ด์ด๋ค.
์ดํญ ๊ณ์์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์์ ์ฌ์ฉํ๋ค. ๊ทธ ์์ ๋ค์๊ณผ ๊ฐ๋ค.
\[\binom{n}{r} = \frac{n!}{r! (n - r)!}\]
ํฉํ ๋ฆฌ์ผ ๊ตฌํ์ ์ฌ๊ท๊ฐ ์๋ ๋ฐ๋ณต๋ฌธ์ผ๋ก ๊ตฌํํ๊ณ , ํน์ ๋ชจ๋ฅผ ์ค๋ฒํ๋ก์ฐ๋ฅผ ์ผ๋์ ๋์ด long long ์๋ฃํ์ ์ฌ์ฉํ๋ค.
ํฉํ ๋ฆฌ์ผ ํ๋ฒ์ O(N)์ด๋ฏ๋ก ์ ์ฒด์ ์ธ ์๊ฐ ๋ณต์ก๋๋ O(N)์ด๋ค.
- ์ฝ๋
๋ด ํ์ด ์ฝ๋
#include <iostream>
using namespace std;
typedef long long ll;
ll Facto(ll llStart);
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
ll llN{}, llK{};
cin >> llN >> llK;
cout << Facto(llN) / (Facto(llK) * Facto(llN - llK));
return 0;
}
// ํฉํ ๋ฆฌ์ผ ๊ตฌํ ํจ์
ll Facto(ll llStart)
{
ll llResult{ 1 };
for(ll i = 2; i <= llStart; ++i)
{
llResult *= i;
}
return llResult;
}
2. ์ถ๊ฐ ํ์ด 1 (์ดํญ ๊ณ์ - ํ์ค์นผ์ ์ผ๊ฐํ)
- ์๊ณ ๋ฆฌ์ฆ
Combinatorics,Mathematics,Dynamic Programming
- ์ค๋ช
์ดํญ ๊ณ์์ ํ์ค์นผ์ ์ผ๊ฐํ ์ ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๋ฐฉ์์ด๋ค.
ํ์ค์นผ์ ์ผ๊ฐํ์ ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ๋ค.
\[C(n, k) = C(n - 1, k - 1) + C(n - 1, k)\]
- ๋ํ
์ดํญ ๊ณ์์ ๊ธฐ๋ณธ์ ์ธ ์ฑ์ง ์ค์ ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ด ์๋ค.
\[C(n, 0) = C(n, n) = 1\]
๋ฐ๋ผ์ ์์ ๋ ์์ ์ด์ฉํ๋ฉด 'DP ์'์ ์ธ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
์ด๋ ๊ฒ ํ๋ฉด N์ด ์ปค์ง๋ ๊ฒฝ์ฐ์ ์ค๋ฒํ๋ก์ฐ์ ๋ํด ๊ฑฑ์ ํ์ง ์์๋ ๋๋ฏ๋ก ์ฌ์ค์ ๊ฐ์ฅ ๋ณดํธ์ ์ด๊ณ ์ ์์ ๊ฐ๊น์ด ๋ฐฉ๋ฒ์ด๋ค.
์ด์ค ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํ๋ฏ๋ก ์๊ฐ ๋ณต์ก๋๋ O(Nยฒ)์ด์ง๋ง N์ด ์์ ๊ฒฝ์ฐ O(N)๊ณผ ํฌ๊ฒ ์ฐจ์ด๊ฐ ์๋ค.
- ์ฝ๋
๋ด ํ์ด ์ฝ๋
#include <iostream>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int iN{}, iK{};
cin >> iN >> iK;
int arrC[11][11]{};
for(int i = 0; i <= iN; ++i)
{
arrC[i][0] = arrC[i][i] = 1;
for(int j = 1; j < i; ++j)
{
arrC[i][j] = arrC[i - 1][j - 1] + arrC[i - 1][j];
}
}
cout << arrC[iN][iK];
return 0;
}
3. ์ถ๊ฐ ํ์ด 2 (์ดํญ ๊ณ์ - ํฉํ ๋ฆฌ์ผ ์ต์ ํ)
- ์๊ณ ๋ฆฌ์ฆ
Combinatorics,Mathematics
- ์ค๋ช
์์ ๋ด ํ์ด์์ ํฉํ ๋ฆฌ์ผ ๋ถ๋ถ์ ์ต์ ํํ ๋ฐฉ์์ด๋ค.
์ดํญ ๊ณ์์ ์ ๋ฆฌ์์
\[\binom{n}{r} = \frac{n!}{r! (n - r)!}\]
- ๋ถ๋ถ์ ๋ค์๊ณผ ๊ฐ์ด ๋ณํํ ์ ์๋ค.
\[\binom{n}{r} = \frac{n \cdot (n + 1) \cdots (n - k + 1)}{k!}\]
- ๊ทธ๋ฆฌ๊ณ ์ด๋ ๋ค์ ๋ค์๊ณผ ๊ฐ์ด ํํํ ์ ์๋ค.
\[\binom{n}{r} = \varPi_{i = 1}^{k} \frac{n - k + i}{i}\]
์ด ๋ฐฉ์์ผ๋ก ํฉํ ๋ฆฌ์ผ์ ์ต์ ํํด์ฃผ๋ฉด, ๊ณ์ฐ ์ค๊ฐ์ ์ค๋ฒํ๋ก์ฐ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ผ๋ฏ๋ก ๋์ฑ ๋ฒ์ฉ์ ์ด๊ณ ์์ ํ ๋ฐฉ๋ฒ์ด๋ค.
ํฉํ ๋ฆฌ์ผ์ ๊ณ์ฐ ์ค๊ฐ ์ค๋ฒํ๋ก์ฐ๋ฅผ ๋ฐฉ์งํ๋ ์ต์ ํ์ผ ๋ฟ์ด๋ฏ๋ก ์๊ฐ ๋ณต์ก๋๋ ์ฌ์ ํ O(N)์ด๋ค.
- ์ฝ๋
๋ด ํ์ด ์ฝ๋
#include <iostream>
using namespace std;
typedef long long ll;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
ll llN{}, llK{};
cin >> llN >> llK;
// ๋ ์์ ๊ฐ ์ ํํด์ ๋ฐ๋ณต๋ฌธ ์ต์ ํ
llK = llK > llN - llK ? llN - llK : llK;
ll llResult{ 1 };
for(ll i = 1; i <= llK; ++i)
{
// long long์ ์ค๋ฒํ๋ก์ฐ ๋ฐฉ์งํ ์ ์๋ค.
llResult = llResult * (llN - llK + i) / i;
}
cout << llResult;
return 0;
}
๐ญ ํ๊ธฐ
์ฌ์ค ์กฐํฉ๋ก ์ ๋ํด์๋ ์ ์์ง ๋ชปํ๊ณ , ์ด๋ฐ ๋ฌธ์ ๋ ์์ ์ด ์๊ณ ๋ฆฌ์ฆ์ ๋ํด ์์ง ๋ชปํ๋ฉด ํ์ง ๋ชปํ๋ ๋ฌธ์ ์ด๋ค.
๋ํ ์กฐํฉ๋ก ์ ์ฌ๋ฌ ์ ๋ฆฌ์ ์ฑ์ง, ๋ณํ์ด ์์ผ๋ฏ๋ก ์ ์์งํด๋๋ ๊ฒ์ด ์ข์ ๋ฏํ๋ค.
Comments