bitmasking
๐ก ๋นํธ๋ง์คํฌ๋ก ๋ถ๋ถ์งํฉ ๋ค๋ฃจ๊ธฐ
๋ถ๋ถ์งํฉ์ ๊ตฌํ ๋ ์ฌ๊ท๋ ๋ฐฑํธ๋ํน์ ๋ง์ด ์ฐ์ง๋ง,
๋นํธ๋ง์คํฌ๋ฅผ ํ์ฉํ๋ฉด ํจ์ฌ ๊ฐ๋จํ๊ณ ๋น ๋ฅด๊ฒ ๊ตฌํํ ์ ์์ต๋๋ค.
์ด๋ฒ ํฌ์คํธ์์๋ {1, 2, 3, 4, 5}
์งํฉ์ ๋์์ผ๋ก
ํฉ์ด 5์ธ ๋ถ๋ถ์งํฉ์ ๊ฐ์๋ฅผ ๊ตฌํ๋ ๋ฐฉ๋ฒ์ ์๊ฐํฉ๋๋ค.
โ ๊ธฐ๋ณธ ๊ฐ๋ : ๋นํธ๋ง์คํฌ๋?
N
๊ฐ์ ์์๊ฐ ์์ ๋, ๋ถ๋ถ์งํฉ์ ์ด ๊ฐ์๋ 2^N
์
๋๋ค.
0๋ถํฐ 2^N - 1
๊น์ง์ ์ซ์๋ฅผ ์ด์ง์๋ก ํํํ๋ฉด,
๊ฐ ๋นํธ๊ฐ ์งํฉ์ ํฌํจ๋์๋์ง ์ฌ๋ถ๋ฅผ ๋ํ๋ผ ์ ์์ต๋๋ค.
1
2
3
4
5
6
7
8
// 1 << 3 = 1000 (8), H[3]์ด ์ฌ๊ธฐ์ ํด๋น
// 1 << 4 = 10000 (16), H[4]๊ฐ ์ฌ๊ธฐ์ ํด๋น
int i = 24; // 2์ง์๋ก 11000
int[] H = {1, 2, 3, 4, 5};
if ((i & (1 << j)) != 0) {
sum += H[j]; // j == 3 ๋๋ j == 4์ผ ๋๋ง ์คํ๋จ โ H[3], H[4]๊ฐ ํฌํจ๋จ
}
์ ์ฝ๋๋ฅผ ๊ฐ๋ตํ๊ฒ ์์ฝํ๋ฉด
์๋ฅผ ๋ค์ด, i = 24 (11000)
์ผ ๋๋
- ์ด์ง์
11000
์ j = 4, 3 ์์น๊ฐ 1์ด๋ผ๋ ๋ป์ด๊ณ - ์ด๋
H[4]
์H[3]
์ด ๋ถ๋ถ์งํฉ์ ํฌํจ๋์๋ค๋ ์๋ฏธ์ ๋๋ค.
๐งฉ ์ค์ต -> ํฉ์ด 5์ธ ๋ถ๋ถ์งํฉ์ ๊ฐ์ ๊ตฌํ๊ธฐ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class SubsetSumCount {
public static void main(String[] args) {
int[] H = {1, 2, 3, 4, 5};
int N = H.length;
int target = 5;
int count = 0;
int subset_cnt = 1 << N; // ๋ถ๋ถ์งํฉ ๊ฐ์ = 2^N
for (int i = 0; i < subset_cnt; i++) {
int sum = 0;
for (int j = 0; j < N; j++) {
// i์ j๋ฒ์งธ ๋นํธ๊ฐ 1์ด๋ผ๋ฉด โ H[j] ํฌํจ
if ((i & (1 << j)) != 0) {
sum += H[j];
}
}
// ํฉ์ด target(5)์ธ ๊ฒฝ์ฐ๋ง count ์ฆ๊ฐ
if (sum == target) {
count++;
}
}
System.out.println("ํฉ์ด " + target + "์ธ ๋ถ๋ถ์งํฉ ๊ฐ์: " + count);
}
}
๐ ์ถ๋ ฅ ๊ฒฐ๊ณผ
1
ํฉ์ด 5์ธ ๋ถ๋ถ์งํฉ ๊ฐ์: 3
This post is licensed under CC BY 4.0 by the author.