๐ป ํฌํจ-๋ฐฐ์ ์ ์๋ฆฌ(Inclusion-Exclusion Principle) ์๊ณ ๋ฆฌ์ฆ ์๋ฒฝ ๊ฐ์ด๋
๋ฒ์จ 20๋ ๊ฐ๊น์ด ์ฝ๋ฉ๋ง ํ๊ณ ์๋ ์๋์ด ๊ฐ๋ฐ์ ํ์ด์ผ. ์ค๋์ ๋ํฌ๊ฐ ๊ผญ ์์์ผ ํ ๊ธฐ์ด๋ฅผ ๋ด๋ฐฑํ๊ฒ ํ์ด์ค๊ฒ. ์ค๋ฌด ๋ ธํ์ฐ๊น์ง ๊ฝ๊ฝ ๋๋ฌ ๋ด์์ผ๋ ์ฒ์ฒํ ๋ฐ๋ผ์ ๋ด.
ํฌํจ-๋ฐฐ์ ์ ์๋ฆฌ(Inclusion-Exclusion Principle)๋ ์กฐํฉ๋ก ์ด๋ ์งํฉ๋ก ์์ ์ฌ๋ฌ ์งํฉ์ ํฉ์งํฉ ํฌ๊ธฐ๋ฅผ ๊ณ์ฐํ๋ ค๊ณ ์ฐ๋ ํต์ฌ์ ์ธ ์ํ ๊ธฐ๋ฒ์ด์ผ. ํ๋ IT ์ฐ์ ์์ ์ด ์๊ณ ๋ฆฌ์ฆ์ ๋คํธ์ํฌ ์ ๋ ๋ถ์, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ ์ต์ ํ, ๊ทธ๋ฆฌ๊ณ ๋ณต์กํ ํ๋ฅ ๊ณ์ฐ ๋ถ์ผ์์ ํ์์ ์ธ ๊ธฐ์ด๋ฅผ ํ์ฑํ๊ณ ์์ด. ํนํ ํ์ ๋ ์์ ์์์ ์ค๋ณต๋ ์์๋ฅผ ์ ๊ฑฐํ๊ณ ์ ํํ ๋ฐ์ดํฐ ์ด๋์ ๋ฝ์์ผ ํ๋ ๋๊ท๋ชจ ์์คํ ์ํคํ ์ฒ๋ฅผ ์งค ๋, ์ด ์๋ฆฌ๋ ์์คํ ์ ๋ขฐ์ฑ์ ๋ณด์ฅํ๋ ๊ฐ๋ ฅํ ๋ ผ๋ฆฌ์ ๊ทผ๊ฑฐ๋ฅผ ์ ๊ณตํด ์ฃผ์ง.
1. ํฌํจ-๋ฐฐ์ ์ ์๋ฆฌ ์๊ณ ๋ฆฌ์ฆ์ ์ํ์ ์ ์์ ์ฐ์ฐ ์ฒด๊ณ
ํฌํจ-๋ฐฐ์ ์ ์๋ฆฌ๋ ์ ํ ์งํฉ๋ค์ ํฉ์งํฉ ํฌ๊ธฐ๋ฅผ ๊ตฌํ๋ ๊ณผ์ ์์ ์๊ธฐ๋ ์ค๋ณต ๊ณ์ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์๊ณ ๋ฆฌ์ฆ์ด์ผ. ๊ธฐ๋ณธ์ ์ผ๋ก ๋ ์งํฉ A๋ B์ ํฉ์งํฉ ํฌ๊ธฐ๋ ๊ฐ ์งํฉ ํฌ๊ธฐ๋ฅผ ๋ํ ๋ค์์, ๊ณตํต๋ถ๋ถ์ธ ๊ต์งํฉ์ ํ ๋ฒ ๋นผ๋ ๋ฐฉ์์ผ๋ก ๊ณ์ฐํด. ์ด๊ฑธ ์ผ๋ฐํํ๋ฉด n๊ฐ์ ์งํฉ์ ๋ํด์ ๊ฐ ์งํฉ ํฌ๊ธฐ๋ฅผ ๋ํ๊ณ , ๋ ๊ฐ์ฉ ์ง์ง์ ๊ต์งํฉ ํฌ๊ธฐ๋ ๋นผ๊ณ , ์ธ ๊ฐ์ฉ ์ง์ง์ ๊ต์งํฉ ํฌ๊ธฐ๋ ๋ค์ ๋ํ๋ ๊ณผ์ ์ ๋ฐ๋ณตํ๊ฒ ๋ผ. ์ด๋ฐ ๊ต๋ ํฉ(Alternating Sum) ๊ตฌ์กฐ๋ ๋ชจ๋ ์์๊ฐ ์ ํํ ํ ๋ฒ์ฉ๋ง ๊ณ์ฐ๋๋๋ก ๋ณด์ฅํ๋ ์ํ์ ์ ๋ฐํจ์ ๊ฐ์ถ๊ณ ์์ด.
์ปดํจํฐ ๊ณผํ ๊ด์ ์์ ๋ณด๋ฉด ์ด ์๊ณ ๋ฆฌ์ฆ์ ์ง์ ์๊ฐ ๋ณต์ก๋(Exponential Time Complexity)๋ฅผ ๊ฐ์ง๋ ๊ฒฝ์ฐ๊ฐ ๋ง์. n๊ฐ์ ์กฐ๊ฑด์ด ์ฃผ์ด์ก์ ๋ ์๊ธฐ๋ ๋ถ๋ถ ์งํฉ ๊ฐ์๊ฐ 2์ n์ ๊ณฑ($2^n$)์ ๋น๋กํ๊ฑฐ๋ . ๊ทธ๋์ ํจ์จ์ ์ผ๋ก ๊ตฌํํ๋ ค๋ฉด ๋นํธ๋ง์คํน(Bitmasking) ๊ธฐ๋ฒ์ ์จ์ ๊ฐ ์ํ๋ฅผ ์ ์ํ ์์๋ก ๊ด๋ฆฌํ๋ ์ต์ ํ๊ฐ ๊ผญ ํ์ํด. ๋นํธ๋ง์คํน์ ๋ชจ๋ ๋นํธ๊ฐ ์ ๊ตฌ ์ค์์น์ฒ๋ผ ์๋ํด์ ํน์ ์งํฉ์ด ํฌํจ๋๋์ง ์๋์ง๋ฅผ 0์ด๋ 1๋ก ๋น ๋ฅด๊ฒ ํ๋ณํ๋ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ด์ผ. ๋นํธ ์ฐ์ฐ์ผ๋ก ๊ฐ ๋ถ๋ถ ์งํฉ ์กฐํฉ์ ํ์ํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ์ฐธ์กฐ ํ์๋ฅผ ํ๊ธฐ์ ์ผ๋ก ์ค์ผ ์ ์๊ณ , CPU ๋ ์ง์คํฐ ์ฐ์ฐ์ ์ต๋ํ ํ์ฉํด์ ์๋๋ฅผ ๋์ผ ์ ์์ด. ๋ ์ํธํ์ ์๊ณ ๋ฆฌ์ฆ์ด๋ ์ ๋ฐ ํต๊ณ ์์คํ ์ฒ๋ผ ์ค์ฐจ๋ฅผ ์ต์ํํด์ผ ํ๋ ๊ณณ์์ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ์ฆ๋ช ํ๋ ๋๊ตฌ๋ก ํ๋ฐํ๊ฒ ์ฐ์ด๊ณ ์์ง.
๊ต์งํฉ ๊ฐ์๊ฐ ํ์๋ฉด ๋ํ๊ณ ์ง์๋ฉด ๋นผ๋ ๋ถํธ ์ฒ๋ฆฌ๋ฅผ ๋นํธ๋ง์คํน์ผ๋ก ๊น๋ํ๊ฒ ๊ตฌํํ๊ณ , ์ซ์๊ฐ ์ปค์ง ์ ์์ผ๋ 64๋นํธ ์ ์ํ์ ์ฐ๋ ๊ฒ ์์ ํด.
2. ํจ์จ์ ์ธ ์๊ณ ๋ฆฌ์ฆ ๊ตฌํ ๋ฐ ์ค๋ฌด ์ ์ฉ ๊ฐ์ด๋
์ค์ ํ๋ก๊ทธ๋๋ฐ ํ๊ฒฝ์์ ํฌํจ-๋ฐฐ์ ์ ์๋ฆฌ๋ฅผ ๊ตฌํํ ๋๋ ์ฌ๊ท ๊ตฌ์กฐ๋ ๋ฐ๋ณต๋ฌธ์ ํตํ ๋นํธ๋ง์คํฌ ์ํ๋ฅผ ์ ํํ๊ฒ ๋ผ. ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ n๊ฐ ์์์ ๋ํด 1๋ถํฐ $2^n - 1$๊น์ง ๋๋ฉด์ ํ์ฌ ๋นํธ ๊ฐ์(Popcount)๋ฅผ ํ์ธํ๋ ๊ฑฐ์ผ. ์ด๋ ๋นํธ ๊ฐ์๊ฐ ํ์๋ฉด ํด๋น ๊ต์งํฉ ํฌ๊ธฐ๋ฅผ ๊ฒฐ๊ณผ์ ๋ํ๊ณ , ์ง์๋ฉด ๋นผ๋ ๋ ผ๋ฆฌ๋ฅผ ์ ์ฉํด. ์ด ๋ ผ๋ฆฌ๋ ๋จ์ํด ๋ณด์ด์ง๋ง ๋๊ท๋ชจ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋๋ ๊ฐ ๊ต์งํฉ ํฌ๊ธฐ๋ฅผ ๊ณ์ฐํ๋ ํจ์(Subroutine)์ ํจ์จ์ฑ์ด ์ฑ๋ฅ์ ์ข์ฐํ๊ฒ ๋ผ. ๋์ ๊ณํ๋ฒ(DP)์ด๋ ๊ฒฐํฉํ๋ฉด ์ด์ ์ ๊ณ์ฐํ ๊ต์งํฉ ๊ฒฐ๊ณผ๋ฅผ ์ฌ์ฌ์ฉํด์ ์ค๋ณต ์ฐ์ฐ์ ์์จ ์ ์๊ณ ์๊ฐ ๋ณต์ก๋๋ ์ ์๋ฏธํ๊ฒ ๊ฐ์ ํ ์ ์์ด.
์๊ณ ๋ฆฌ์ฆ ์์ ์ฑ์ ๋์ด๋ ค๋ฉด ์ค๋ฒํ๋ก์ฐ(Overflow) ๋์ฑ ์ด๋ ๊ฒฝ๊ณ๊ฐ ์กฐ๊ฑด ์ฒ๋ฆฌ๊ฐ ์ค์ํด. ์งํฉ์ด ๋ง์์ง๋ฉด ๊ฒฐ๊ณผ๊ฐ 32๋นํธ ์ ์ ๋ฒ์๋ฅผ ํ์ฉ ๋๊ธฐ๊ธฐ ์ผ์ค๋ผ ๊ผญ 64๋นํธ ์ ์ํ(long long ๋๋ int64)์ ์จ์ผ ํด. ๊ทธ๋ฆฌ๊ณ ๊ต์งํฉ์ด ๊ณต์งํฉ์ธ ๊ฒฝ์ฐ์๋ 0์ ๋ฐํํ๋๋ก ์์ธ ์ฒ๋ฆฌ๋ฅผ ๋ช ์ํด์ค์ผ ํ์ง. ์ค๋ฌด์์๋ ๊ฒ์ ์์ง ํํฐ๋ง ์์คํ ์์ ํน์ ํค์๋ ์กฐํฉ์ ๋บ ๊ฒ์ ๊ฒฐ๊ณผ ์ด๊ฐ์๋ฅผ ๋ฝ์ ๋ ์ด ์๊ณ ๋ฆฌ์ฆ์ด ๋ด๋ถ์ ์ผ๋ก ์ฐ์ฌ. ์๋ฅผ ๋ค์ด 'A ํค์๋๋ฅผ ํฌํจํ๊ฑฐ๋ B๋ฅผ ํฌํจํ์ง๋ง C๋ ํฌํจํ์ง ์๋' ๋ฌธ์ ๊ฐ์๋ฅผ ์ธ๋ ์ฟผ๋ฆฌ๋ ํฌํจ-๋ฐฐ์ ์ ์๋ฆฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ต์ ํ๋ ์คํ ๊ณํ์ ๋ง๋ค์ด๋ด์ง. ์ด๋ฐ ์ ๊ตํ ์ ์ด๋ ๋ฆฌ์์ค ๋ญ๋น๋ฅผ ๋ง๊ณ ์ฌ์ฉ์์๊ฒ ๋น ๋ฅธ ์๋ต์ ์ฃผ๋ ์๋๋ ฅ์ด ๋ผ.
// C++ ๊ธฐ๋ฐ ๋นํธ๋ง์คํน์ ํ์ฉํ ํฌํจ-๋ฐฐ์ ์๋ฆฌ ์์ ์ฝ๋
long long countUnion(int n, vector<long long>& sets) {
long long total = 0;
for (int i = 1; i < (1 << n); ++i) {
long long common = 0; // ๊ต์งํฉ ๊ณ์ฐ ๋ก์ง
int bits = 0;
for (int j = 0; j < n; ++j) {
if (i & (1 << j)) {
// j๋ฒ์งธ ์งํฉ์ด ํฌํจ๋ ๊ฒฝ์ฐ์ ์ฒ๋ฆฌ
bits++;
}
}
if (bits % 2 == 1) total += common;
else total -= common;
}
return total;
}
4. ์๋์ด ํ์ ์ค๋ฌด ์ฝ์ง๊ธฐ
์๋ ๊ฐ์์ ์ฌ๋ด ๋ง์ผํ ๋ฐ์ดํฐ ์ถ์ถ ๋๊ตฌ๋ฅผ ๋ฆฌํฉํฐ๋ง ํ๋ค๊ฐ ๋ฉฐ์น ์ ๊ณ ์ํ๋ ๊ธฐ์ต์ด ๋๋ค. ๋น์ ์ฌ๋ฌ ๊ด๊ณ ์ฑ๋๋ก ๋ค์ด์จ ์ค๋ณต๋์ง ์์ ์ ์ ์๋ฅผ ๊ณ์ฐํด์ผ ํ๋๋ฐ, ๋จ์ํ ํฉ์งํฉ ์ฐ์ฐ๋ง ์๊ฐํ๋ค๊ฐ ์ซ์๊ฐ ํฐ๋ฌด๋์์ด ํฌ๊ฒ ๋์์ ๋นํฉํ์์ด. ์๊ณ ๋ณด๋๊น ๋ด๊ฐ ๊ต์งํฉ์ ๋บ ๋ ๋นํธ๋ง์คํน ๋ก์ง์์ ํ์๋ ์ง์ ์กฐ๊ฑด์ ๋ฐ๋๋ก ์ ๋ ์ฌ์ํ ์ค์๋ฅผ ํ๋๋ผ๊ณ . ๊ทธ๋๋ ์ ๊ฒฐ๊ณผ๊ฐ ๋ง์ด๋์ค๋ก ๋์ค๋์ง ๋ชฐ๋ผ์ ์ง์ง ๋ต๋ตํ์ง. ๋ฐค์ ๊ณ ๋ฏผํ๋ค๊ฐ ๋๊ธฐํํ ์ฝ๋๋ฅผ ๋ณด์ฌ์คฌ๋๋ ๋ถํธ ์ฒ๋ฆฌ๊ฐ ์๋ชป๋๋ค๊ณ ์๋ ค์ค์ ๊ธ๋ฐฉ ํด๊ฒฐํ์ด. ๋ณต์กํ ์กฐํฉ๋ก ์๊ณ ๋ฆฌ์ฆ์ ์ธ ๋๋ ๋ฌด์กฐ๊ฑด ์ข ์ด์ ์งํฉ ๊ทธ๋ฆผ์ ๊ทธ๋ ค๋ณด๊ณ ๋ถํธ๋ฅผ ๊ฒ์ฆํด์ผ ํ๋ ๊ฒ ๊ฐ์.
- ๊ฐ๋ : ์ค๋ณต๋ ์์๋ฅผ ์ ์ธํ๊ณ ์ฌ๋ฌ ์งํฉ์ ํฉ์งํฉ ํฌ๊ธฐ๋ฅผ ๊ตฌํ๋ ๊ต๋ ํฉ ์๋ฆฌ์ผ.
- ํต์ฌ ๊ธฐ์ : ๋นํธ๋ง์คํน(Bitmasking)์ ์จ์ 2^n ์ํ ๊ณต๊ฐ ํ์์ ์ต์ ํํ๋ ๊ฒ ํฌ์ธํธ์ง.
- ์ฃผ์์ฌํญ: ๊ต์งํฉ ๊ฐ์์ ๋ฐ๋ฅธ ๋ถํธ(+/-) ๊ฒฐ์ ์ด๋ ํฐ ์ซ์ ์ฒ๋ฆฌ๋ฅผ ์ํ ๋ฐ์ดํฐ ํ์ ์ ์ ์ ๊ผญ ์ ๊ฒฝ ์จ์ผ ํด.
- ํ์ฉ: ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ ์ต์ ํ๋ ๋ณต์กํ ํ๋ฅ ๊ณ์ฐ ๋ฑ ์ค๋ณต ์ ๊ฑฐ๊ฐ ํ์ํ ๋ชจ๋ ๊ณณ์ ์ฐ์ฌ.
์ฝ๋ฉ์ ๊ฒฐ๊ตญ ์๋ฉ์ด ์ธ์์ด๋ค. ๋๊น์ง ํฌ๊ธฐํ์ง ๋ง๋ผ. ํ์ด ์์ํ๋ค.
๊ถ๊ธํ ๊ฒ ์์ผ๋ฉด ์ธ์ ๋ ๋๊ธ ๋จ๊ฒจ์ค. ์ฌํ๊ทผ๋ฌด ํ๋ค๊ฐ ์งฌ์งฌ์ด ํ์ธํด์ ๋์์ค๊ฒ!
