๋ชจ๋ ์์๋ค์ ์ฌ์ฉ์ ๋ฌด๋ฅผ ํ์ ํด ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๋ํ๋ด๊ฑฐ๋, ์งํฉ์ผ๋ก ํํํ ๋ ์ฌ์ฉํ๋ค.
: {๊ณต์งํฉ}, {a} , {b} {c} {d} {a,b} {a,c} {a,d} {b, c} {b, d} {c, d} {a,b,c} {a,b,d} {a, c,d} {b, c, d} {a,b,c,d}
=> ์ด 16๊ฐ๋ก ํํํ ์ ์๋ค.
๊ฐ ์์๋ค์ ์๊ณ ์๊ณ ์ ๋ฐ๋ผ ๋ํ๋ผ ์ ์๋ค.
์์์ 0์ผ๋ก ํ๊ณ , ์์์ 1๋ก ๋ํ๋ด๋ฉด, ๋นํธ๋ก ๋ํ๋ผ์ ์๋ค.
์ญ์ง์ : ๋ถ๋ถ์งํฉ : ๋นํธ๋ก ํํ
0 : {} -> {0,0,0,0}
1 :{a} -> {0,0,0,1}
2 : {b} -> {0,0,1,0}
3 : {c} -> {0,1,0,0}
4 : {d} -> {1,0,0,0}
5 : {a,b} -> {0,0,1,1}
6 : {a,c} -> {0,1,0,1}
7 : {a,d} -> {1,0,0,1}
8 : {b, c} -> {0,1,1,0}
9 : {b, d} -> {1,0,1,0}
10 : {c, d} -> {1,1,0,0}
11 : {a,b,c} -> {0,1,1,1}
12 : {a,b,d} -> {1,0,1,1}
13 : {a, c,d} -> {1,1,0,1}
14 : {b, c, d} -> {1,1,1,0}
15 : {a,b,c,d}-> {1,1,1,1}
: ์ด๋ ๊ฒ ํํํ๋ ๊ฒ์ ๋นํธ๋ง์คํน์ด๋ผ๊ณ ํ๋ค.
: i << (1 << cnt);
์ ์ด๊ฑฐ๋๋ฉด (1 << cnt)
๋ง์ฝ์ cnt๊ฐ 4๋ผ๋ฉด (1 << 4) ๋ 10000 ์ด๋ ๊ฒ ๋์ค๊ณ
์ญ์ง์๋ก ๋ํ๋ด๋ฉด 16์ด๊ธฐ ๋๋ฌธ์ด๋ค.
{a,b,c,d}์ ์ด ์งํฉ์ ์๋ 16์ด๋ค.
์ ?
: ์์๊ฐ 3๊ฐ์ผ ๊ฒฝ์ฐ์๋ a , b, c, ์ด๋ ๊ฒ ์๋ค ํ๋ฉด
a, b, c
x x x
0 x x
0 0 x
0 x 0
x 0 x
x x 0
x 0 0
0 0 0
-> ์ด 8๊ฐ์ ๊ฒฝ์ฐ์ ์๊ฐ ๋์ด.
์ด๊ฒ์ ์์ ๊ฐ์๋ฆฌ์ ๋นํธ๋ฅผ ๋ํ๋ธ๊ฒ์ด๋ ๋ค๋ฆ์์.
1 << ์์์ ๊ฐ์๋ฅผ ์ด์ฉํด์ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๋ํ๋ผ ์ ์์.
1 << i ๋ฅผ ํ๋ฉด ๋๋ค.
1์ 2๋ฒ ์ด๋ํ๊ฒ ๋๋ฉด 100 ์ด ๋๋ค.
: i๋ฒ์งธ ์์๊ฐ ์๋์ง ํ์ธํ๋ ๋ฐฉ๋ฒ์
(๋นํธ๋ก ํํ๋ ์งํฉ) & (1 < i) ๊ฒฐ๊ณผ๊ฐ 0์ด ์๋๋ฉด ์กด์ฌ
<i๋ฅผ ์ฆ๊ฐ ์ํค๋ฉด์ ์์๋๋ก ํ์ธ์ด ๊ฐ๋ฅํ๋ค>
ex) 2๋ฒ์งธ ์์๊ฐ ์๋์ง ํ์ธ
: 0101 & (1 << 2) =>(๊ฒฐ๊ณผ) 0101 & 0100 = 0100 ์ด๋ฏ๋ก ์กด์ฌํ๋ค.
-> ์์๋ ๋งจ ์์์ ๊ณผ์ผ์ ์ ํํ ์ ์๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ
๊ตฌํ ๋ ์ฌ์ฉ๋จ.
: (๋นํธ๋ก ํํ๋ ์งํฉ) | (1 << i)
์๋ํ๋ฉด | ์ฐ์ฐ์๋ ๋ํ๋ ์๋ฏธ์ด๋ค.
ex) 1๋ฒ์งธ ์์๋ฅผ ์ถ๊ฐ
0101 | (1 << 1) => (๊ฒฐ๊ณผ) 0101 | 0010 = 0111
: (๋นํธ๋ก ํํ๋ ์งํฉ) &~(1<<i)
์๋ํ๋ฉด & ์ฐ์ฐ์๋ 2๊ฐ์ ๋นํธ๊ฐ ๋ชจ๋ ๋์ผํด์ผ 1๋ก ๋ฐํ๋๊ธฐ ๋๋ฌธ์
ํ๊ณณ์ 0์ผ๋ก ๋ง๋ค์ด๋ณด๋ฆฌ์๋ ์๋์ด๋ค.
ex) 2๋ฒ์งธ ์์๋ฅผ ์ญ์
0101 & ~(1<<2) => (๊ฒฐ๊ณผ) 0101 & ~(0100) = 0101 & 1011 = 0001
int countBits(int n)
{
int ret = 0;
while(n)
{
if(n & 1) ret++;
n = n >> 1;
}
return ret;
}
5์ ์์๋ฅผ ๊ฐ์ง๊ณ ์๋ ์งํฉ์ด๋ผ๊ณ ํ๋ค๋ฉด
// { 1,1,1,1,1};
data = ( ( 1 << 5) - 1 )
: ์ ํ๋ธ ezsw ๋ ๊ฐ์!
https://www.youtube.com/watch?v=Bujy_-O99xQ&list=PL6YHvWRMtz7DS3hVaqMazHujPcKVfblQa&index=3
: ๋ถ๋ฆฌ์ธ ๋ฐฐ์ด์ ์ญํ ์ ํ๋ ํ๋์ ์ซ์๋ฅผ ๋ง๋ค์ด์, ๋นํธ์ฐ์ฐ์๋ฅผ ํตํด
ํ์, ์์ ๋ฑ์ ์์
์ ํ๋ ๊ฒ์ ๋นํธ๋ง์คํน์ด๋ผ๊ณ ํจ.
: 2์ง์๋ง ๋นํธ์ฐ์ฐ์ ํํ๋๋ ๊ฒ์ด ์๋๋ผ, 10์ง์๋ ์ปดํฐ ์
์ฅ์์
์์์ 2์ง์๋ก ๋ฐ๋ผ๋ด.
-> 10์ง์๋ฅผ 2์ง์๋ก ๋ฐ๋ผ๋ณด๋ ์์ ์ ๊ฐ์ง๊ณ ์งํํ์.
--> ์ ์ฒด๋ฅผ for ๋ฌธ์ผ๋ก 1 << cnt ์ด๋ ๊ฒ ํํํ ๊ฑด๋ฐ
10์ง์ ์ผ ๋ฟ, ์ปดํฐ๋ 2์ง์๋ก ๋ฐ๋ผ๋ณธ๋ค๋ ์๊ฐ์ ๊ฐ์ง์.
: ์์์ , ์ธ๋ฑ์ค์ ๊ฐฏ์๊ฐ 30๊ฐ ์ดํ์ผ ๊ฒฝ์ฐ์ ์ฌ์ฉ๊ฐ๋ฅํจ.
1) ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๋ฒ์๋ก ๋ง๋ค์ด์ผ ํจ.
[๊ฐ][๋] [๋ค]
: ๋ชจ๋ ๊ฒฝ์ฐ์ ์ : 000 / 001 010 100 101 110 111
ํ๋์ ๊ตฌํ์์ ์ ํํ ์ ์๋ ๊ฒฝ์ฐ, 2๊ฐ์ง , ์ด ๋ช๊ฐ 3๊ฐ
-> 2์ 3์น.
2์ n์น - 1์
-> ์ด ๋ฒ์๋ฅผ ๋จผ์ ๋ง๋ค์ด์ผ ํจ.
1๋จ๊ณ
: for(int i =0; i < (1 << n); ++i)
2) ์ธ๋ฑ์ค ํ๋ํ๋์ฉ 1๊ณผ & ์ฐ์ฐ์๋ก ๋น๊ตํ๊ธฐ
#include <iostream>
using namespace std;
#include <string>
int main()
{
string fruit[4] = { "์ฌ๊ณผ","๊ทค","ํฌ๋","๋ธ๊ธฐ" };
cout << "๋ํ๋ผ ์ ์๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋? " << endl;
// 15 ๋ฒ์ ๋๋ ค์ผ ํจ.
// 15๋ฒ์ ์ด๋ป๊ฒ ํํํ ์ ์์ ๊น???
// ์ด์ง์๋ก ๋ํ๋ผ์ ์์์ ์๊ณ ์์ด์ผ ํจ.
// ๋ชจ๋ ์๋ 2์ง์๋ก ํํ์ด ๊ฐ๋ฅํ๋ค๋ผ๋ ๊ฒ์ ์์ง ํด์ผํจ.
int n = 0;
// ์ํํธ๋ฅผ ํ๋ฉด์ ๋น๊ตํ ํ์
// ์ฌ๊ธฐ์ ์ํํธ๋ ๊ทธ๋ฅ + 1์ฉ ์ฆ๊ฐํ๋ ๊ฐ์ผ๋ก ๋น๊ตํ๋ฉด ๋ ๋ฏ>?
for (int i = 0; i < (1 << 4) ; ++i)
{
// 0 0 0 1
// 0 0 1 0
// ๋ฑ๋ฑ...
cout << "{ ";
for (int j = 0; j < 4; j++)
{
// ์ด๋ฏธ i ๊ฐ์ ๊ณ ์ ๋์ด ์๋๋ฐ//
// ์ด๊ฑฐ๋ฅผ ์ด๋ป๊ฒ ๊ฐ ์ธ๋ฑ์ค์ ๋น๊ต๋ฅผ ํ ๊ฒ์ธ๊ฐ
// ์ ๋ํ ๊ณ ์ฐฐ์ด ์ค์ํจ...
// 0000 ๊ณผ 4๊ฐ๋ฅผ ๋น๊ต??
// ๊ฒฐ๊ณผ : ์๋ฌด๊ฒ๋ ์๋์ด,.
// 0001 ๊ณผ 4๊ฐ๋ฅผ ๋น๊ต??
// ๊ฒฐ๊ณผ : ์ฌ๊ณผ๋ง ๋์ด
// ๊ฐ ์๋ฆฌ์ ์์น์ i๋ฅผ ๋น๊ตํด์ผํจ.
// ๊ฐ ์๋ฆฌ์๋ 2์ ์ ๊ณฑ์น์์ ํ์
์ ํด์ผํจ.
// ๋ฐ์์ i๋ฒ์งธ ์์๊ฐ ์๋์ง ํ์ธํ๋ ๊ณต์์ ์ฌ๊ธฐ์ ์ฌ์ฉํ์.
if (i & (1 << j))
cout << fruit[j] << " ";
}
cout << " } ";
}
}
: ๋ชจ๋ ์๋ 2์ง์๋ก ํํ์ด ๊ฐ๋ฅํจ.
-> ๋นํธ๋ง์คํน์ ์ด์ฉํด ์ฒ๋ฆฌ ๊ฐ๋ฅํจ.
๋ฌธ์ !
์์ : ์ฌ๊ณผ, ๊ทค, ํฌ๋, ๋ธ๊ธฐ ์ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ํํํ๋ผ.
1๋ฒ : ์๋ฌด๊ฒ๋ ์์
2๋ฒ :์ฌ๊ณผ
3๋ฒ :๊ทค
4๋ฒ :์ฌ๊ณผ ๊ทค
5๋ฒ :ํฌ๋
6๋ฒ :ํฌ๋ ์ฌ๊ณผ
7๋ฒ :ํฌ๋ ๊ทค
8๋ฒ :ํฌ๋ ์ฌ๊ณผ ๊ทค
...
15๋ฒ :์ฌ๊ณผ ๊ทค ํฌ๋ ๋ธ๊ธฐ
: ์ด 15๊ฐ๋ก ๋ํ๋ผ์ ์์!
์ฌ๊ณผ : -> 0 0 0 1 => 1
๊ทค : -> 0 0 1 0 => 2
ํฌ๋ : -> 0 1 0 0 => 4
๋ธ๊ธฐ : -> 1 0 0 0 => 8
์ด๋ค.
์ด์ฐจํผ for๋ฌธ์ผ๋ก 4๊ฐ๋ฅผ ๋๋ฆฌ๋ฉด์ ์กฐํฉํ๋ฉด์ ์ฒ๋ฆฌํ ๊ฒ์ด๋ฏ๋ก
๊ฐ ์์๋ค์ ์์น๊ฐ๊ณผ i๋ฅผ & ํ์๋ ์ด์ผ๊ธฐ์.
๊ฒฐ๊ณผ :
for (int i = 0; i < (1 << 4) ; ++i)
{
for(int j = 0; j < 4; j++)
{
i & (1 << j)
// ์ด๋ฐ์์ผ๋ก ์งํ!
}
}
: ์งํฉ{a,b,c,d}๋ฅผ ๋ํ๋ผ์ ์๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์ถ๋ ฅํ๋ผ!
1) for๋ฌธ์ ์ด๋๊น์ง ๋๋ฆด์ง๋ฅผ ์๊ฐํด๋ณด๋ฉด, 0์์ 16๋ฏธ๋ง ๊น์ง์ด๋ค.
๊ทธ๋ฌ๋ฏ๋ก for(int i = 0; i < (1 << size); i++) ์ด๋ ๊ฒ ํํํ ์ ์๋ค.
2) & ์ฐ์ฐ์๋ฅผ ์ด์ฉํ ๊ฒฐ๊ณผ๊ฐ 1์ด๋ฉด ์ถ๋ ฅํ๊ณ , ์๋๋ฉด PASS
A๊ฐ ์์์ผ๋ก ๋์ค๊ฒ ํ๋ ค๋ฉด ๋ง์ง๋ง ๋นํธ๊ฐ "1" ์ด์ด์ผ ํ๋ค.
์ผ๋จ ๊ฐ์ฅ ํฐ for๋ฌธ์ 0 ์์๋ถํฐ 15๊น์ง ๋๋ค.
0000 -> 1111 ๊น์ง ๋๊ฒ ๋๋ ๊ฒ์ธ๋ฐ , i๋ฒ์งธ ์์๊ฐ ์๋์ง ํ์ธํ๋ ๋ฐฉ๋ฒ์
(๋นํธ๋ก ํํ๋ ์งํฉ) & (1 < i) ๊ฒฐ๊ณผ๊ฐ 0์ด ์๋๋ฉด ์กด์ฌ
ex) 2๋ฒ์งธ ์์๊ฐ ์๋์ง ํ์ธ
: 0101 & (1 << 2) =>(๊ฒฐ๊ณผ) 0101 & 0100 = 0100 ์ด๋ฏ๋ก ์กด์ฌํ๋ค.
#include <iostream>
using namespace std;
void printSubset(char *data, int cnt)
{
int c = 0;
for (int i = 0; i < (1 << cnt); i++)
{
cout << " { ";
for (int j = 0; j < cnt; j++)
{
c++;
if (i & (1 << j))
cout << data[j] << " ";
}
cout << " } " << endl;
}
cout << c << endl;
}
//0000
//0001
//0010
//0011
int main()
{
char word[4] = { 'a', 'b', 'c', 'd' };
printSubset(word, 4);
return 0;
}
์ฐ์ต๋ฌธ์ : 1,2,3,4,5,6 ๋ก ์ด๋ฃจ์ด์ง ์งํฉ์ ์์๋ฅผ ํ๋ฒ๋ง ์ฌ์ฉํด์ ํฉ์ด 7์ด ๋์ฌ ์ ์๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋?
์งํฉ ํ์์ผ๋ก ์ถ๋ ฅํ๋ผ!!
#include <string>
#include <vector>
#include <sstream>
#include <iostream>
using namespace std;
int arr[] = { 1,2,3,4,5,6 };
void solve()
{
int cnt = 0;
cout << "1,2,3,4,5,6์ ํ๋ฒ์ฉ ๋ง ์ฌ์ฉํด์ ๋ํด์ 7์ด ๋์ฌ์ ์๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋" << endl;
//์กฐํฉํด์ ํฉ์ด 7 ์ธ ๊ฒฝ์ฐ์ ์งํฉ์ ์ถ๋ ฅํ๊ณ ๊ฒฝ์ฐ์ ์๋ ์ถ๋ ฅํ์.
for (int i = 0; i < (1 << 6); i++)
{
vector<int>v;
int sum = 0;
for (int j = 0; j < 6; j++)
{
//0720 ์ ์ด๋ ๊ฒ ํด์ผํ๋์ง ์๋๋ฅผ ํ์
ํด์ผ ํจ...
if (i & (1 << j))
{
sum += arr[j];
v.push_back(arr[j]);
}
}
if (sum == 7)
{
cnt++;
cout << "{";
for(auto k : v)
cout << k;
cout << "}" << endl;
}
}
cout << "7์ ๋ง๋ ํ์๋ ?" << endl;
cout << cnt;
}
int main()
{
solve();
}
: ์นด์นด์ค 2019 ํ๋ณดํค