๐Ÿ’ป CS/์•Œ๊ณ ๋ฆฌ์ฆ˜

๋น„ํŠธ๋งˆ์Šคํ‚น

JerryiOS 2023. 5. 13. 14:32

๋น„ํŠธ๋งˆ์Šคํ‚น

์ปดํ“จํ„ฐ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ๋ชจ๋“  ์ž๋ฃŒ๋ฅผ ์ด์ง„์ˆ˜๋กœ ํ‘œํ˜„ํ•œ๋‹ค. ์ด๋Ÿฐ ํŠน์„ฑ์„ ์ด์šฉํ•ด ์ •์ˆ˜์˜ ์ด์ง„์ˆ˜ํ‘œํ˜„์„ ์ž๋ฃŒ๊ตฌ์กฐ๋กœ ์“ฐ๋Š” ๊ธฐ๋ฒ•

๋น„ํŠธ๋งˆ์Šคํฌ๋ฅผ ์ด์šฉํ•˜๋ฉด ๋” ๋น ๋ฅธ ์ˆ˜ํ–‰์‹œ๊ฐ„, ๋” ๊ฐ„๊ฒฐํ•œ ์ฝ”๋“œ, ๋” ์ ์€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

๋น„ํŠธ ์—ฐ์‚ฐ์ž

๋น„ํŠธ๋งˆ์Šคํ‚น์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋น„ํŠธ๋ฅผ ๋‹ค๋ค„์•ผ ํ•˜๋ฏ€๋กœ, ๋น„ํŠธ ์—ฐ์‚ฐ์ž์— ๋Œ€ํ•ด์„œ ๋จผ์ € ์•Œ์•„๋ณด์ž.

a & b a์˜ ๋ชจ๋“  ๋น„ํŠธ์™€ b์˜ ๋ชจ๋“  ๋น„ํŠธ๋ฅผ AND ์—ฐ์‚ฐํ•œ๋‹ค.

๋‘˜๋‹ค 1์ด๋ผ๋ฉด 1, ์•„๋‹ˆ๋ฉด 0
ex)
100 & 111 = 100
a | b a์˜ ๋ชจ๋“  ๋น„ํŠธ์™€ b์˜ ๋ชจ๋“  ๋น„ํŠธ๋ฅผ OR ์—ฐ์‚ฐํ•œ๋‹ค.

๋‘˜๋‹ค 0์ด๋ผ๋ฉด 0, ์•„๋‹ˆ๋ฉด 1
ex)
010 | 111 = 111
a ^ b a์˜ ๋ชจ๋“  ๋น„ํŠธ์™€ b์˜ ๋ชจ๋“  ๋น„ํŠธ๋ฅผ XOR ์—ฐ์‚ฐํ•œ๋‹ค.

๋‘˜์ด ๋‹ค๋ฅด๋‹ค๋ฉด 1, ์•„๋‹ˆ๋ฉด 0
ex)
011 ^ 101 = 110
~a a์˜ ๋ชจ๋“  ๋น„ํŠธ์— NOT ์—ฐ์‚ฐ์„ ํ•œ๋‹ค.

0์ด๋ฉด 1, 1์ด๋ฉด 0
ex)
a = 011
~a = 100
a << b
a๋ฅผ b๋น„ํŠธ ๋งŒํผ ์™ผ์ชฝ์œผ๋กœ ์‹œํ”„ํŠธ

ex)
a = 001
a << 2 = 100
a >> b
a๋ฅผ b๋น„ํŠธ ๋งŒํผ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์‹œํ”„ํŠธ

ex)
a = 100
a >> 2 = 001

 

์ง‘ํ•ฉ์˜ ํ‘œํ˜„

๋น„ํŠธ๋งˆ์Šคํฌ๋ฅผ ํ‘œํ˜„ํ•˜๋ฉด ์ง‘ํ•ฉ์„ ์‰ฝ๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋˜ํ•œ, ์ง‘ํ•ฉ์— ์›์†Œ๋ฅผ ์ถ”๊ฐ€, ์‚ญ์ œํ•˜๋Š” ๋“ฑ ๋‹ค์–‘ํ•œ ์—ฐ์‚ฐ์„ ๋น ๋ฅด๊ฒŒํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์›์†Œ์˜ ๊ฐœ์ˆ˜๊ฐ€ N์ธ ์ง‘ํ•ฉ์ด ์žˆ๋‹ค๊ณ  ํ•˜๋ฉด, ๊ฐ ์›์†Œ๋ฅผ 0 ~ (N-1)๋ฒˆ๊นŒ์ง€ ๋ฒˆํ˜ธ๋ฅผ ๋ถ€์—ฌํ•˜๊ณ 

๋ฒˆํ˜ธ์— ํ•ด๋‹นํ•˜๋Š” ๋น„ํŠธ๊ฐ€ 1์ด๋ฉด ์›์†Œ ํฌํ•จ, 0์ด๋ฉด ๋ถˆํฌํ•จ์ด๋ผ๊ณ  ํ•œ๋‹ค๋ฉด ๋น„ํŠธ๋ฅผ ์ด์šฉํ•ด ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด, { A, B, C, D, E, F, G } ์ง‘ํ•ฉ์ด ์žˆ๋‹ค๊ณ  ํ•ด๋ณด์ž.

 

์ด 7๊ฐœ ์›์†Œ๊ฐ€ ์กด์žฌํ•˜๋‹ˆ๊นŒ ์šฐ๋ฆฌ๋Š” 7๊ฐœ์˜ ๋น„ํŠธ๋กœ ์ง‘ํ•ฉ์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. 1011011 ์ด๋Ÿฐ์‹์œผ๋กœ..

๊ฐ ์›์†Œ๋งˆ๋‹ค ๋น„ํŠธ๋ฅผ ํ•˜๋‚˜์”ฉ ๋Œ€์‘์‹œ์ผœ์„œ ์›์†Œ๊ฐ€ ์กด์žฌํ•˜๋ฉด 1, ์•„๋‹ˆ๋ฉด 0์œผ๋กœ ํ‘œํ˜„ํ•ด๋ณด์ž.

{A} ๋ผ๋Š” ๋ถ€๋ถ„์ง‘ํ•ฉ์€ 64 - 1000000(2)๋กœ ํ‘œํ˜„ํ•˜๊ณ  { C, F } ๋Š” 18 - 0010010(2) ๋กœ ํ‘œํ˜„ํ•  ๊ฒƒ์ด๋‹ค.

 

์›์†Œ ์ถ”๊ฐ€

ํ˜„์žฌ ์ƒํƒœ cur์ด ์žˆ์„ ๋•Œ, p๋ฒˆ ์›์†Œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค๊ณ  ํ•ด๋ณด์ž.

๊ทธ๋ ‡๋‹ค๋ฉด ํ˜„์žฌ ์ƒํƒœ cur์—์„œ p๋ฒˆ ๋น„ํŠธ๋ฅผ 1๋กœ ๋ฐ”๊ฟ”์ค˜์•ผํ•œ๋‹ค.

๋น„ํŠธ์—ฐ์‚ฐ์ž '|' ๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

cur = cur | (1<<p)

3๋ฒˆ์งธ ์›์†Œ ์ถ”๊ฐ€

 

์›์†Œ ์‚ญ์ œ

์›์†Œ ์‚ญ์ œ๋Š” p๋ฒˆ ๋น„ํŠธ๋ฅผ 0์œผ๋กœ ๋ฐ”๊ฟ”์ค˜์•ผํ•œ๋‹ค.

cur = cur & ~(1 << p)

 

1<<p๋ฅผ ํ†ตํ•ด์„œ p๋ฒˆ ๋น„ํŠธ๋งŒ 1, ๋‚˜๋จธ์ง€๋Š” 0์œผ๋กœ ๋งŒ๋“ ๋‹ค.

๊ทธ ํ›„, ~์—ฐ์‚ฐ์„ ํ†ตํ•ด p๋ฒˆ ๋น„ํŠธ๋งŒ 0, ๋‚˜๋จธ์ง€๋Š” 1๋กœ ๋งŒ๋“ค๊ณ  & ์—ฐ์‚ฐ์„ ์ง„ํ–‰ํ•˜๋ฉด p๋ฒˆ ๋น„ํŠธ๋งŒ 0์œผ๋กœ ๋ฐ”๋€Œ๊ณ  ๋‚˜๋จธ์ง€๋Š” cur๊ณผ ๋™์ผํ•˜๊ฒŒ ์œ ์ง€ํ•œ๋‹ค.

 

 

์›์†Œ ํ† ๊ธ€

์›์†Œ ํ† ๊ธ€์€ p๋ฒˆ ๋น„ํŠธ๊ฐ€ 1์ด๋ฉด 0, 0์ด๋ฉด 1์ด๋‹ค.

ํ˜„์žฌ ์ƒํƒœ์—์„œ p๋ฒˆ ์›์†Œ๊ฐ€ ์žˆ๋‹ค๋ฉด ์‚ญ์ œํ•˜๊ณ , ์—†๋‹ค๋ฉด ์ถ”๊ฐ€ํ•œ๋‹ค.

cur = cur ^ (1<<p)

^ ์—ฐ์‚ฐ์€ ๋‹ค๋ฅด๋‹ค๋ฉด 1 ๊ฐ™์œผ๋ฉด 0์œผ๋กœ ์—ฐ์‚ฐํ•œ๋‹ค. ๋น„๊ตํ•  ๊ฐ’(1<<idx)์€ 00100์ด๋‹ค.

3๋ฒˆ์งธ ์›์†Œ๊ฐ€ 0์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์— 1๋กœ ๋ฐ”๋€Œ์—ˆ๋‹ค.

 

์ง‘ํ•ฉ ์—ฐ์‚ฐ

๋น„ํŠธ๋งˆ์Šคํ‚น์„ ์ด์šฉํ•˜๋ฉด ํ•ฉ, ๊ต, ์ฐจ์ง‘ํ•ฉ ๋“ฑ์„ ์‰ฝ๊ฒŒ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

  • a | b : ํ•ฉ์ง‘ํ•ฉ
  • a & b : ๊ต์ง‘ํ•ฉ
  • a & ~b : a์—์„œ b๋ฅผ ๋บ€ ์ฐจ์ง‘ํ•ฉ
  • a ^ b : a์™€ b ์ค‘ ํ•˜๋‚˜์—๋งŒ ํฌํ•จ๋œ ์›์†Œ๋“ค์˜ ์ง‘ํ•ฉ

 

์ง‘ํ•ฉ์˜ ํฌ๊ธฐ ๊ตฌํ•˜๊ธฐ

์ง‘ํ•ฉ์˜ ํฌ๊ธฐ๋ฅผ ๊ตฌํ•˜๋ ค๋ฉด, ํ˜„์žฌ 1๋กœ ์ผœ์ ธ์žˆ๋Š” ๋น„ํŠธ์˜ ์ˆ˜๋ฅผ countํ•ด์•ผํ•œ๋‹ค.

๋”ฐ๋ผ์„œ, ๋ชจ๋“  ๋น„ํŠธ๋ฅผ ์ˆœํšŒํ•ด์•ผํ•˜๊ณ  ์žฌ๊ท€์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

func countBit(_ x: Int) -> Int {
	if x == 0 { return 0 }
    return x % 2 + countBit(x / 2)
}

 

๋ชจ๋“  ๋ถ€๋ถ„์ง‘ํ•ฉ ์ˆœํšŒํ•˜๊ธฐ

์–ด๋–ค ์ง‘ํ•ฉ์˜ ๋ชจ๋“  ๋ถ€๋ถ„์ง‘ํ•ฉ์„ ์ˆœํšŒํ•˜๋Š” ๊ณผ์ •๋„ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

func processSubsets(of set: Int) {
    var subset = set
    while subset != 0 {
        // subset์€ set์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ ์ค‘ ํ•˜๋‚˜.
        
        // ์—ฌ๊ธฐ์— ๋ถ€๋ถ„์ง‘ํ•ฉ ์ฒ˜๋ฆฌ ๋กœ์ง์„ ์ž‘์„ฑํ•œ๋‹ค.
        
        subset = (subset - 1) & set
    }
}

 

์˜ˆ๋ฅผ ๋“ค์–ด ์ง‘ํ•ฉ์›์†Œ A, B, C, D ์ค‘ { A, B, D } ๋ฅผ ํฌํ•จํ•œ ์ง‘ํ•ฉ์„ ์ƒ๊ฐํ•ด๋ณด์ž.

๋ชจ๋“  ๋ถ€๋ถ„ ์ง‘ํ•ฉ์€ ๊ณต์ง‘ํ•ฉ์„ ์ œ์™ธํ•˜๊ณ  {A}, {B}, {D}, {A, D}, {B, D}, {A, B, D} ๊ฐ€ ์กด์žฌํ•œ๋‹ค.

๋น„ํŠธ๋กœ ํ‘œํ˜„ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • {A, B, D} : 1101
  • {A, B} : 1100
  • {A, D} : 1001
  • {B, D} : 0101
  • {A} : 1000
  • {B} : 0100
  • {D} : 0001

 

์ด์ œ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋ฅผ ๋”ฐ๋ผ๊ฐ€๋ณด์ž.

  subset (subset-1) (subset-1) & set(1101)
A B D 1101 1100 1100
A B 1100 1011 1001
A D 1001 1000 1000
A 1000 0111 0101
B D 0101 0100 0100
B 0100 0011 0001
D 0001 0000 0000

while ๋ฌธ์„ ํ†ตํ•ด ๋ถ€๋ถ„์ง‘ํ•ฉ์„ ๋‹ค ์ˆœํšŒํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๋ฐ˜์‘ํ˜•