๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm

[์Šคํ„ฐ๋””] ๋น„ํŠธ์กฐ์ž‘ , ์™„์ „ํƒ์ƒ‰

by bba_dda 2020. 8. 3.
๋ฐ˜์‘ํ˜•

๋น„ํŠธ ์กฐ์ž‘


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

AND

  • ๋‘˜ ๋‹ค 1์ด๋ฉด 1, ๋‘˜ ์ค‘ ํ•˜๋‚˜๋ผ๋„ 0์ด๋ฉด 0์ด๋‹ค.
  • 1010 AND 1110 = 1010
  • ์—ฐ์‚ฐ์ž : &

OR

  • ๋‘˜ ์ค‘ ํ•˜๋‚˜๋ผ๋„ 1์ด๋ฉด 1, ๋‘˜๋‹ค 0์ด๋ฉด 0์ด๋‹ค.
  • 1010 OR 1110 = 1110
  • ์—ฐ์‚ฐ์ž : |

NOT

  • ๋ชจ๋“  bit๊ฐ’์„ ๋ฐ˜๋Œ€๋กœ ๋ฐ”๊พผ๋‹ค
  • NOT ( 1010 ) = 0101
  • ์—ฐ์‚ฐ์ž : ~

XOR

  • ๊ฐ’์ด ๊ฐ™์œผ๋ฉด 0, ๋‹ค๋ฅด๋ฉด 1์ด๋‹ค.
  • 1010 XOR 1110 = 0100
  • ์—ฐ์‚ฐ์ž : ^

๋น„ํŠธ ์‹œํ”„ํŠธ

  • ์‚ฐ์ˆ  ์šฐ์ธก ์‹œํ”„ํŠธ
    • ๊ฐ’์„ 2๋กœ ๋‚˜๋ˆˆ ๊ฒƒ๊ณผ ๊ฐ™๋‹ค.
    • ์—ฐ์‚ฐ์ž : >>
    • ๋ถ€ํ˜ธ ๋น„ํŠธ๋Š” ๋ฐ”๋€Œ์ง€ ์•Š์Œ.
  • ๋…ผ๋ฆฌ ์šฐ์ธก ์‹œํ”„ํŠธ
    • ์ผ๋ฐ˜์ ์œผ๋กœ ๋น„ํŠธ๋ฅผ ์˜ฎ๊ธธ ๋•Œ ์ฒ˜๋Ÿผ ๋™์ž‘ํ•œ๋‹ค.
    • ์—ฐ์‚ฐ์ž : >>>
    • ๋น„ํŠธ๋ฅผ ์šฐ์ธก์œผ๋กœ์˜ฎ๊ธด ํ›„์—, ์ตœ์ƒ์œ„ ๋น„ํŠธ์— 0์„ ๋„ฃ๋Š”๋‹ค.

์ถ”๊ฐ€ ์ •๋ณด

  • 0s : ๋ชจ๋“  bit๊ฐ€ 0
  • 1s : ๋ชจ๋“  bit๊ฐ€ 1

2์˜ ๋ณด์ˆ˜, ์Œ์ˆ˜

  • ์ปดํ“จํ„ฐ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ •์ˆ˜๋ฅผ 2์˜ ๋ณด์ˆ˜ ํ˜•ํƒœ๋กœ ์ €์žฅํ•œ๋‹ค.
  • ์Œ์ˆ˜์— ๋Œ€ํ•ด์„œ๋Š”, ๋ถ€ํ˜ธ๋น„ํŠธ๋ฅผ 1๋กœ ์„ธํŒ…ํ•œ ํ›„ 2์˜ ๋ณด์ˆ˜๋ฅผ ์ทจํ•œ ํ˜•ํƒœ๋กœ ํ‘œํ˜„ํ•œ๋‹ค.
  • n๋น„ํŠธ ์ˆซ์ž์— ๋Œ€ํ•œ 2์˜ ๋ณด์ˆ˜๋Š”, 2์˜ n์Šน์— ๋Œ€ํ•œ ๋ณด์ˆ˜์™€ ๊ฐ™๋‹ค.

C++ ์—์„œ์˜ ๋น„ํŠธ ์กฐ์ž‘

  • std::bitset์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด, header๋ฅผ ํฌํ•จํ•ด์•ผ ํ•œ๋‹ค.

๋น„ํŠธ ์กฐ์ž‘ ์•Œ๊ณ ๋ฆฌ์ฆ˜

  • ์ฝ”๋”ฉ ์ธํ„ฐ๋ทฐ ์ค€๋น„์—์„œ ๋Šฅ์ˆ™ํ•œ ๋น„ํŠธ์กฐ์ž‘ ๋Šฅ๋ ฅ์€ ์ค‘์š”ํ•˜๋‹ค.

Get

  • ํŠน์ • ์œ„์น˜์— ์žˆ๋Š” bit๊ฐ’์„ ๊ฐ€์ ธ์˜จ๋‹ค.
  • idx = 0์€, LSB์˜ ์œ„์น˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
bool getBit(int num, int idx){
    return (1<<idx)& num != 0;
}
  • ์ž…๋ ฅ

    ๋Œ€์ƒ ์ˆซ์ž, bit๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ ์ž ํ•˜๋Š” ์œ„์น˜

  • ์ถœ๋ ฅ

    0 or 1 (boolean value)

    ์ด ๋•Œ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ณ ์ž ํ•˜๋Š” ์œ„์น˜๋Š” LSB์—์„œ 0์ด๋‹ค.

Set

  • ํŠน์ • ์œ„์น˜์˜ bit๊ฐ’์„ 1๋กœ ์„ค์ •ํ•œ๋‹ค.
int setBit(int num, int idx){
    return num | (1 << idx);
}

Clear

  • ํŠน์ • ์œ„์น˜์˜ bit๊ฐ’์„ ์ง€์šด๋‹ค. (0์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.)
int clearBit(int num, int idx){
    int mask = ~(1 << idx);
    return num & mask;
}
  • ํ•œ ๊ฐœ๊ฐ€ ์•„๋‹Œ, ํŠน์ • ๋ฒ”์œ„์˜ ๋น„ํŠธ ์—ฌ๋Ÿฌ๊ฐœ๋ฅผ ์ง€์šฐ๊ณ  ์‹ถ์„ ๋•Œ
int clearBits(int num, int start, int end){
    int headMask = (~0 >> start) << start;
    //32๋น„ํŠธ ์ •์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— 31
    int tailMask = (~0 << (31-end)) >> (31 - end);

    int mask = headMask & tailMask;
    return num & mask;
}

Update

  • ํŠน์ • ์œ„์น˜์˜ bit๋ฅผ ์›ํ•˜๋Š” ๊ฐ’์œผ๋กœ ๊ฐฑ์‹ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํŠน์ • ์œ„์น˜์˜ bit์„ clearํ•œ ํ›„์—, ๋‹ค์‹œ ์›ํ•˜๋Š” value๋กœ setํ•˜๋ฉด ๋œ๋‹ค.
int updateBit(int num, int idx, int val){
    return (num & ~(1 << idx)) | (val << idx);
}

Toggle

  • 0 -> 1, 1 -> 0์œผ๋กœ ๋ฐ”๊พธ์–ด ์ฃผ๋Š” ๊ฒƒ.
  • xor์—ฐ์‚ฐ์„ ํ†ตํ•ด ํ•  ์ˆ˜ ์žˆ๋‹ค
int Toggle(int num, int idx){
    return num ^ (1 << idx);
}

MSB, LSB

  • Serial Communication์„ ํ•  ๋•Œ, ํ•˜๋‚˜์˜ ๋‹จ์œ„์‹œ๊ฐ„์— ํ•˜๋‚˜์˜ ๋น„ํŠธ๋งŒ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์–ด๋–ค ์œ„์น˜์˜ bit ๋ถ€ํ„ฐ ์ „์†ก๋˜๋Š”์ง€๋ฅผ ์•Œ์•„์•ผ ํ•œ๋‹ค.

    MSB๋ถ€ํ„ฐ ๋ณด๋‚ด๋Š”์ง€, LSB๋ถ€ํ„ฐ ๋ณด๋‚ด๋Š”์ง€๋ฅผ ์•„๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค.

    ์†ก์ˆ˜์‹ ์ธก์—์„œ ์ด ๋ถ€๋ถ„์„ ํ†ต์ผํ•˜์ง€ ๋ชปํ•˜๋ฉด ์ˆ˜์‹ ์ด ์ž˜๋ชป๋œ๋‹ค.

  • LSB

    Least Significant Bit์˜ ์•ฝ์ž.

    ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ ํ˜•์—์„œ ๊ฐ€์žฅ ๋‚ฎ์€ ์œ„์น˜์˜ bit์„ ์˜๋ฏธํ•œ๋‹ค.

    2์˜ 0์Šน ์ž๋ฆฌ

bool getLSB(int num){ 
    int mask = ~(num) + 1; return num & mask; 
}
  • MSB

    Most Significant Bit์˜ ์•ฝ์ž.

    ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ ํ˜•์—์„œ ๊ฐ€์žฅ ๋†’์€ ์œ„์น˜์˜ bit์„ ์˜๋ฏธํ•œ๋‹ค.

    unsinged char type์—์„œ MSB๋Š” 2์˜ 7์Šน์œ„์น˜์˜ ๊ฐ’์„ ์˜๋ฏธํ•œ๋‹ค.

    signed char type์—์„œ MSB๋Š” ๋ถ€ํ˜ธ ์ž๋ฆฌ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๋”ฐ๋ผ์„œ MSB๋กœ ํ•ด๋‹น ์ˆ˜๊ฐ€ ์Œ์ˆ˜์ธ์ง€ ์–‘์ˆ˜์ธ์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

bool getMSB(int num){
    return num >> 31; 
}

์ฐธ๊ณ ์ž๋ฃŒ

https://iamsjy17.github.io/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98_%EA%B8%B0%EC%B4%88/2019/05/09/bitop.html

https://m.blog.naver.com/PostView.nhn?blogId=ansdbtls4067&logNo=220886567257&proxyReferer=https:%2F%2Fwww.google.com%2F

https://m.blog.naver.com/PostView.nhn?blogId=yhjeong89&logNo=220770224996&proxyReferer=https:%2F%2Fwww.google.com%2F

์™„์ „ ํƒ์ƒ‰


์žฌ๊ท€ ํ˜ธ์ถœ

  • ์žฌ๊ท€ ํ•จ์ˆ˜

    ํ•จ์ˆ˜ ๋‚ด์—์„œ ์ž๊ธฐ ์ž์‹ ์„ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜๋Š” ํ˜•ํƒœ์˜ ํ•จ์ˆ˜๋ฅผ ๋งํ•œ๋‹ค.

    • ์ปค๋‹ค๋ž€ ๋ฌธ์ œ๋ฅผ ์œ ์‚ฌํ•œ ์—ฌ๋Ÿฌ ์ž‘์€ ์กฐ๊ฐ์œผ๋กœ ์ชผ๊ฐ  ๋’ค, ํ•œ ์กฐ๊ฐ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋‚˜๋จธ์ง€๋ฅผ ์ž๊ธฐ ์ž์‹ ์„ ํ˜ธ์ถœํ•ด์„œ ์‹คํ–‰ํ•˜๋Š” ํ•จ์ˆ˜
    void recurFunction(void){
        recurFunction();
    }
    • ์œ„์˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ ํ•จ์ˆ˜ ๋‚ด๋ถ€์— ์ž๊ธฐ ์ž์‹ ์„ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜๋Š” ํ˜•ํƒœ์ด๋ฉด ๋˜์ง€๋งŒ, ์œ„์˜ ์ฝ”๋“œ๋Š” ์ •์ƒ์ ์ธ ์‚ฌ๋ก€๊ฐ€ ์•„๋‹ˆ๋‹ค. base case๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

    • base case

      • ๋” ์ด์ƒ ์ชผ๊ฐค ์ˆ˜ ์—†๋Š” ๊ฐ€์žฅ ์ž‘์€ ์ž‘์—…. (์ตœ์†Œํ•œ์˜ ์ž‘์—…)

        ์žฌ๊ท€ํ˜ธ์ถœ์„ ํ•˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ returnํ•˜๋Š” ์กฐ๊ฑด๋ฌธ์— ํฌํ•จ๋œ๋‹ค

      • base case๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์žฌ๊ท€ ํ•จ์ˆ˜๋Š” ์˜์›ํžˆ ์ข…๋ฃŒ๋˜์ง€ ์•Š์•„ ์˜ค๋ฅ˜๋ฅผ ์ผ์œผํ‚จ๋‹ค.

      • base case๋ฅผ ์„ ํƒํ•  ๋•Œ๋Š”, ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜์— ๋Œ€ํ•ด ํ•ญ์ƒ base case๋ฅผ ์ด์šฉํ•ด ๊ณ„์‚ฐ๋  ์ˆ˜ ์žˆ๋„๋ก ๊ณ ๋ คํ•ด์„œ ์„ ํƒํ•ด์•ผ ํ•œ๋‹ค.

์™„์ „ ํƒ์ƒ‰

  • brute - force (๋ฌด์‹ํ•˜๊ฒŒ ํ‘ผ๋‹ค)๋ผ๊ณ ๋„ ๋ถˆ๋ฆฐ๋‹ค.

  • ์ปดํ“จํ„ฐ์˜ ๋น ๋ฅธ ๊ณ„์‚ฐ ์†๋„๋ฅผ ์ด์šฉํ•ด ์–ด๋–ค ๋ฌธ์ œ์— ๋Œ€ํ•ด ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ „๋ถ€ ๋งŒ๋“ค์–ด๋ณด๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋œปํ•œ๋‹ค.

  • ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ์—์„œ ์ฃผ์–ด์ง„ ์ œํ•œ ์‹œ๊ฐ„๊ณผ ํ•ด๋‹น ๋ฌธ์ œ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„ ๋ฐ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋น„๊ตํ•ด์„œ ์™„์ „ํƒ์ƒ‰์œผ๋กœ ํ’€์–ด๋„ ๊ดœ์ฐฎ์„์ง€ ํŒ๋‹จํ•ด์•ผ ํ•œ๋‹ค.

  • ์˜ˆ๋ฅผ๋“ค์–ด 4์ž๋ฆฌ ์ˆซ์ž๋กœ ์ด๋ฃจ์–ด์ง„ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋งž์ถฐ์•ผ ํ•˜๋Š” ๋ฌธ์ œ์—์„œ, 0000 ~ 9999์˜ ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ๋‹ค ์ง‘์–ด๋„ฃ์–ด ๋ณด๋Š” ๋ฐฉ์‹์„ ๋งํ•œ๋‹ค.

์™„์ „ ํƒ์ƒ‰ ๋ฐฉ๋ฒ•

  1. ๋ฐ˜๋ณต๋ฌธ ์‚ฌ์šฉ
    • ๋ฐ˜๋ณต๋ฌธ์„ ์ค‘์ฒฉํ•ด์„œ ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค
  2. ๋น„ํŠธ ๋งˆ์Šคํฌ
    • ์ •์ˆ˜๋ฅผ ๋น„ํŠธ์—ด๋กœ ํ‘œํ˜„ํ•˜๋ฉด ์ง‘ํ•ฉ์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค.
    • 5์ž๋ฆฌ ๋น„ํŠธ๋กœ ์ด๋ฃจ์–ด์ง„ ์ •์ˆ˜๋กœ 5๋ช…์˜ item์— ๋Œ€ํ•œ ๋ชจ๋“  ์ง‘ํ•ฉ์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค.
    • n๋ฒˆ์งธ ์›์†Œ๋ฅผ ํฌํ•จํ•˜๊ณ  ์‹ถ์œผ๋ฉด n๋ฒˆ์งธ bit๋ฅผ 1๋กœ ์„ค์ •ํ•˜๊ณ , ์ œ์™ธํ•˜๊ณ  ์‹ถ์œผ๋ฉด 0์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ๋œ๋‹ค.
    • ์œ„์— ์žˆ๋Š” ๋น„ํŠธ ์กฐ์ž‘ ์—ฐ์‚ฐ์„ ์ด์šฉํ•˜์—ฌ ํ’€ ์ˆ˜ ์žˆ๋‹ค.
  3. ์ˆœ์—ด, ์กฐํ•ฉ ์‚ฌ์šฉ
    • ์ˆœ์—ด, ์กฐํ•ฉ ํ•จ์ˆ˜๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•ด์„œ ์‚ฌ์šฉํ•ด๋„ ๋˜์ง€๋งŒ, C++์˜ ๊ฒฝ์šฐ STL์˜ algorithm์— ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ ๊ตฌํ˜„๋˜์–ด ์žˆ๋‹ค.
      • next_permutation
      • prev_permutation
  4. ์žฌ๊ท€ ํ•จ์ˆ˜ ์‚ฌ์šฉ

์ฐธ๊ณ ์ž๋ฃŒ

https://ikso2000.tistory.com/75

https://twpower.github.io/82-next_permutation-and-prev_permutation

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€