๐Ÿ˜Ž ๊ณต๋ถ€ํ•˜๋Š” ์ง•์ง•์•ŒํŒŒ์นด๋Š” ์ฒ˜์Œ์ด์ง€?

[Coding Interview University] ๋น„ํŠธ ์—ฐ์‚ฐ : ์ด๋ก  ๋ฐ ๊ตฌํ˜„ ๋ณธ๋ฌธ

๐Ÿ‘ฉ‍๐Ÿ’ป ์ปดํ“จํ„ฐ ๊ตฌ์กฐ/Computer Science

[Coding Interview University] ๋น„ํŠธ ์—ฐ์‚ฐ : ์ด๋ก  ๋ฐ ๊ตฌํ˜„

์ง•์ง•์•ŒํŒŒ์นด 2023. 7. 11. 01:26
728x90
๋ฐ˜์‘ํ˜•

<๋ณธ ๋ธ”๋กœ๊ทธ๋Š” ์ฝ”๋”ฉ์ธํ„ฐ๋ทฐ๋Œ€ํ•™ ๋‹˜์˜ Git๊ณผ ์„œ์ ์„ ์ฐธ๊ณ ํ•ด์„œ ๊ณต๋ถ€ํ•˜๋ฉฐ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค :-)>

 

๐Ÿซง ๋น„ํŠธ ์กฐ์ž‘

: 0s ๋Š” ๋ชจ๋“  ๋น„ํŠธ๊ฐ€ 0 ์ธ ๊ฐ’

: 1s ๋Š” ๋ชจ๋“  ๋น„ํŠธ๊ฐ€ 1 ์ธ ๊ฐ’

: ์—ฐ์‚ฐ๋“ค์ด ๋น„ํŠธ ๋‹จ์œ„๋กœ ์ด๋ฃจ์–ด ์ง„๋‹ค!

: ํ•œ ๋น„ํŠธ์—์„œ ์ผ์–ด๋‚˜๋Š” ์ผ์ด ๋‹ค๋ฅธ ๋น„ํŠธ์— ์–ด๋–ค ์˜ํ–ฅ๋„ ๋ฏธ์น˜์ง€ ์•Š๋Š”๋‹ค

 

๐Ÿซง 2์˜ ๋ณด์ˆ˜์™€ ์Œ์ˆ˜

: ์ปดํ“จํ„ฐ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ •์ˆ˜๋ฅผ ์ €์žฅํ•  ๋•Œ 2์˜ ๋ณด์ˆ˜ ํ˜•ํƒœ๋กœ ์ €์žฅ

: ์–‘์ˆ˜๋ฅผ ํ‘œํ˜„ํ•  ๋• ๋ฌธ์ œ ์—†์Œ

: ์Œ์ˆ˜๋ฅผ ํ‘œํ˜„ํ•  ๋• ๊ทธ ์ˆ˜์˜ ์ ˆ๋Œ“๊ฐ’์— ๋ถ€ํ˜ธ๋น„ํŠธ๋ฅผ 1๋กœ ์„ธํŒ…ํ•œ ๋’ค 2์˜ ๋ณด์ˆ˜๋ฅผ ์ทจํ•œ ํ˜•ํƒœ๋กœ ํ‘œํ˜„ํ•จ

: N๋น„ํŠธ ์ˆซ์ž์— ๋Œ€ํ•œ 2์˜ ๋ณด์ˆ˜๋Š” 2^N ์— ๋Œ€ํ•œ ๋ณด์ˆ˜๊ฐ’๊ณผ ๊ฐ™์Œ (N์€ ๋ถ€ํ˜ธ๋น„ํŠธ๋ฅผ ๋บ€ ๋‚˜๋จธ์ง€ ๊ฐ’์„ ํ‘œํ˜„ํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๋น„ํŠธ์˜ ๊ฐœ์ˆ˜)

: 2์˜ ๋ณด์ˆ˜๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ ์–‘์ˆ˜๋กœ ํ‘œํ˜„๋œ 2์ง„์ˆ˜๋ฅผ ๋’ค์ง‘์€ ๋’ค 1์„ ๋”ํ•ด ์ฃผ๋Š” ๊ฒƒ

 

 
 

๐Ÿซง ์‚ฐ์ˆ  ์šฐ์ธก ์‹œํ”„ํŠธ VS ๋…ผ๋ฆฌ ์šฐ์ธก ์‹œํ”„ํŠธ

  • ์‚ฐ์ˆ  ์šฐ์ธก ์‹œํ”„ํŠธ
    • ๊ธฐ๋ณธ์ ์œผ๋กœ 2๋กœ ๋‚˜๋ˆˆ ๊ฒฐ๊ณผ์™€ ๊ฐ™์Œ
  • ๋…ผ๋ฆฌ ์šฐ์ธก ์‹œํ”„ํŠธ
    • ์ผ๋ฐ˜์ ์œผ๋กœ ๋น„ํŠธ๋ฅผ ์˜ฎ๊ธธ ๋•Œ ๋ณด์ด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์›€์ง์ž„
    • ๋น„ํŠธ๋ฅผ ์˜†์œผ๋กœ ์˜ฎ๊ธด ๋‹ค์Œ์— ์ตœ์ƒ์œ„ ๋น„ํŠธ์— 0์„ ๋„ฃ๋Š”๋‹ค (>>> ์—ฐ์‚ฐ)
    • ๋น„ํŠธ๋ฅผ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์˜ฎ๊ธฐ๊ธด ํ•˜์ง€๋งŒ ๋ถ€ํ˜ธ๋น„ํŠธ๋Š” ๋ฐ”๊พธ์ง€ ์•Š๋Š”๋‹ค

 

๐Ÿซง ๊ธฐ๋ณธ์ ์ธ ๋น„ํŠธ ์กฐ์ž‘ : ๋น„ํŠธ๊ฐ’ ํ™•์ธ ๋ฐ ์ฑ„์›Œ๋„ฃ๊ธฐ

๐Ÿ’– ๋น„ํŠธ๊ฐ’ ํ™•์ธ

: 1 ์„ i ๋น„ํŠธ๋งŒํผ ์‹œํ”„ํŠธ์—์„œ 00010000์™€ ๊ฐ™์€ ๊ฐ’ ๋งŒ๋“ค๊ธฐ

: AND ์—ฐ์‚ฐ์„ ํ†ตํ•ด num ์˜ i๋ฒˆ์งธ ๋น„ํŠธ๋ฅผ ๋บ€ ๋‚˜๋จธ์ง€ ๋น„ํŠธ๋ฅผ ๋ชจ๋‘ ์‚ญ์ œํ•œ ๋’ค, ์ด ๊ฐ’์„ 0๊ณผ ๋น„๊ต

: ์ด ๊ฐ’์ด 0์ด ์•„๋‹ˆ๋ผ๋ฉด i๋ฒˆ์งธ ๋น„ํŠธ๋Š” 1, 0์ด๋ผ๋ฉด i๋ฒˆ์งธ ๋น„ํŠธ๋Š” 0์ด์–ด์•ผ ํ•จ

boolean getBit(int num, int i) {
	return ((num % (1 << i)) != );
}

 

๐Ÿงก ๋น„ํŠธ๊ฐ’ ์ฑ„์›Œ๋„ฃ๊ธฐ

: 1์„ i๋น„ํŠธ๋งŒํผ ์‹œํ”„ํŠธํ•ด์„œ 00010000์™€ ๊ฐ™์€ ๊ฐ’ ๋งŒ๋“ค๊ธฐ

: OR ์—ฐ์‚ฐ์„ ํ†ตํ•ด num์˜ i๋ฒˆ์งธ ๋น„ํŠธ๊ฐ’ ๋ฐ”๊พธ๊ธฐ

: i๋ฒˆ์งธ๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๋น„ํŠธ๋“ค์€ 0๊ณผ OR ์—ฐ์‚ฐ์„ ํ•˜๋ฏ€๋กœ num์— ์˜ํ–ฅ ์—†์Œ

int setBit(int num, int i) {
    return num | (1 << i);
}

 

๐Ÿ’› ๋น„ํŠธ๊ฐ’ ์‚ญ์ œํ•˜๊ธฐ

: NOT ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•ด 00010000 ์„ 11101111 ์™€ ๊ฐ™์ด ๋งŒ๋“  ๋’ค num๊ณผ AND ์—ฐ์‚ฐ

: ๋‚˜๋จธ์ง€ ๋น„ํŠธ์˜ ๊ฐ’์€ ๋ณ€ํ•˜์ง€ ์•Š์€ ์ฑ„ i ๋ฒˆ์งธ ๋น„ํŠธ๊ฐ’๋งŒ ์‚ญ์ œ๋จ

int clearBit(int num, int i) {
	int mask = ~(1 << i);
	return num & mask;
}

: ์ตœ์ƒ์œ„ ๋น„ํŠธ์—์„œ i๋ฒˆ์งธ ๋น„ํŠธ๊นŒ์ง€ ๋ชจ๋‘ ์‚ญ์ œํ•˜๋ ค๋ฉด (1 << i) ๋กœ i๋ฒˆ์งธ ๋น„ํŠธ๋ฅผ 1๋กœ ์„ธํŒ…ํ•œ ๋’ค ์ด ๊ฐ’์—์„œ 1์„ ๋บ€๋‹ค

: i๋ฒˆ์งธ ๋น„ํŠธ ๋ฐ‘์€ ๋ชจ๋‘ 1๋กœ ์„ธํŒ…๋˜๊ณ  ๊ทธ ์œ„๋กœ๋Š” ๋ชจ๋‘ 0์œผ๋กœ ์„ธํŒ…

: mask ๊ฐ’๊ณผ num์„ AND ์—ฐ์‚ฐํ•œ๋‹ค๋ฉด ํ•˜์œ„ i๊ฐœ์˜ ๋น„ํŠธ๋ฅผ ๋บ€ ๋‚˜๋จธ์ง€ ๋น„ํŠธ๋ฅผ ๋ชจ๋‘ ์‚ญ์ œ ํ•  ์ˆ˜ ์žˆ์Œ

int clearBitMSBthroughI(int num, int i) {
	int mask = (1 << i) - 1;
	return num & mask;
}

: i ๋ฒˆ์งธ ๋น„ํŠธ์—์„œ 0๋ฒˆ์งธ ๋น„ํŠธ๊นŒ์ง€ ๋ชจ๋‘ ์‚ญ์ œํ•˜๋ ค๋ฉด ๋ชจ๋“  ๋น„ํŠธ๊ฐ€ 1๋กœ ์„ธํŒ…๋œ -1์„ ์™ผ์ชฝ์œผ๋กœ i + 1๋งŒํผ ์‹œํ”„ํŠธ ํ•œ๋‹ค

: i๋ฒˆ์งธ ๋น„ํŠธ ์œ„๋กœ๋Š” ๋ชจ๋‘ 1๋กœ ์„ธํŒ…๋˜๊ณ  ํ•˜์œ„ i๊ฐœ ๋น„ํŠธ๋Š” ๋ชจ๋‘ 0์œผ๋กœ ์„ธํŒ…๋จ

int clearBitsIthrough0(int num, int i) {
	int mask = (-1 << (i + 1));
	return num & mask;
}

 

๐Ÿ’š ๋น„ํŠธ๊ฐ’ ๋ฐ”๊พธ๊ธฐ

: i๋ฒˆ์งธ ๋น„ํŠธ๊ฐ’์„ v๋กœ ๋ฐ”๊พธ๊ณ  ์‹ถ๋‹ค๋ฉด, ์šฐ์„  11101111์™€ ๊ฐ™์€ ๊ฐ’์„ ์ด์šฉํ•ด i๋ฒˆ์งธ ๋น„ํŠธ๊ฐ’์„ ์‚ญ์ œํ•ด์•ผ ํ•จ

: ๋ฐ”๊พธ๊ณ ์ž ํ•˜๋Š” ๊ฐ’ v๋ฅผ ์™ผ์ชฝ์œผ๋กœ i๋ฒˆ ์‹œํ”„ํŠธ ํ•œ๋‹ค

: i๋ฒˆ์งธ ๋น„ํŠธ๊ฐ’์€ v๊ฐ€ ๋  ๊ฒƒ์ด๊ณ  ๋‚˜๋จธ์ง€๋Š” ๋ชจ๋‘ 0์ด ๋  ๊ฒƒ์ด๋‹ค

: ๋งˆ์ง€๋ง‰์œผ๋กœ OR ์—ฐ์‚ฐ์„ ์ด์šฉํ•ด i๋ฒˆ์งธ ๋น„ํŠธ๊ฐ’์„ v๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค

int updateBit(int num, int i, boolean bitIs1) {
	int value - bitIs1 ? 1 : 0;
	int mask = ~(1 << i);
	return (num & mask) | (value << i);
}

 

๐Ÿซง 2์˜ ๋ณด์ˆ˜, ์Œ์ˆ˜

: ์ปดํ“จํ„ฐ๊ฐ€ ์ •์ˆ˜๋ฅผ ์ €์žฅํ•  ๋•Œ๋Š” ๋Œ€๋ถ€๋ถ„ 2์˜ ๋ณด์ˆ˜ ํ˜•ํƒœ๋กœ ์ €์žฅ

: ์Œ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ธฐ์กด์˜ ์ˆ˜์—์„œ ๋น„ํŠธ๋ฅผ ๋’ค์ง‘์€ ๋‹ค์Œ(1์˜ ๋ณด์ˆ˜) 1์„ ๋”ํ•ด์ฃผ๋ฉด ๋˜๋Š”๋ฐ, ์ด๋Š” ๊ธฐ์กด์˜ ์ˆ˜๋ฅผ 2์˜ ๋ณด์ˆ˜ ํ‘œํ˜„์„ ์ด์šฉํ•ด์„œ ์Œ์ˆ˜๋กœ ๋‚˜ํƒ€๋‚ธ ๊ฒƒ

 

๐Ÿซง ์‚ฐ์ˆ  ์‹œํ”„ํŠธ, ๋…ผ๋ฆฌ ์‹œํ”„ํŠธ

: ๋น„ํŠธ๋ฅผ 1bit์”ฉ ๋ฐ€๋ฉด์„œ ์ƒ๊ธด ๋นˆ์ž๋ฆฌ์— ์ƒˆ๋กœ์šด bit๋ฅผ ์ฑ„์›Œ์ฃผ๋Š” ์—ฐ์‚ฐ

 

๐Ÿซง ๊ธฐ๋ณธ ์—ฐ์‚ฐ

  • NOT [~] : 1์ด๋ฉด 0, 0์ด๋ฉด 1
  • OR [|] : ๋‘ ๊ฐ’ ์ค‘ 1์ด ํ•˜๋‚˜๋ผ๋„ ์žˆ๋‹ค๋ฉด 1, ์•„๋‹ˆ๋ฉด 0
  • ํ•ฉ์ง‘ํ•ฉ ๊ฐœ๋…๊ณผ ์œ ์‚ฌํ•˜๋‹ค.
  • XOR [^] : ๋‘ ๊ฐ’์ด ๋‹ค๋ฅด๋ฉด 1, ๊ฐ™์œผ๋ฉด 0
  • ์‹ค์ œ๋กœ๋Š” XOR์— ๋“ค์–ด๊ฐ€๋Š” ๊ฐ’ ์ค‘ 1์˜ ๊ฐฏ์ˆ˜๊ฐ€ ํ™€์ˆ˜๊ฐœ์ด๋ฉด 1
  • AND [&] : ๋‘ ๊ฐ’ ๋ชจ๋‘ 1์ด๋ผ๋ฉด 1, ์•„๋‹ˆ๋ฉด 0
  • ๊ต์ง‘ํ•ฉ ๊ฐœ๋…๊ณผ ์œ ์‚ฌํ•˜๋‹ค.
  • SHIFT [<< >>] : ๋น„ํŠธ ๋‹จ์œ„๋กœ ํ•œ ์นธ์”ฉ ๋ฏธ๋Š” ์—ฐ์‚ฐ

 

๐Ÿซง ํ•จ์ˆ˜ ๊ตฌํ˜„

  1. Get : ํŠน์ • ์œ„์น˜์˜ ๋น„ํŠธ ๊ฐ’์„ ๊ฐ€์ ธ์˜จ๋‹ค.
  2. Set : ํŠน์ • ์œ„์น˜์˜ ๋น„ํŠธ ๊ฐ’์„ ์„ธํŒ…ํ•œ๋‹ค.
  3. Count : ์„ธํŒ…๋œ ๋น„ํŠธ ๊ฐ’์ด ๋ช‡ ๊ฐœ์ธ์ง€ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  4. Clear : ๋น„ํŠธ๋ฅผ 0์œผ๋กœ ์ดˆ๊ธฐํ™” ํ•œ๋‹ค.
  5. Toggle : ๋น„ํŠธ๋ฅผ ๋ฐ˜์ „์‹œํ‚จ๋‹ค.
  6. MSB : ์ตœ์ƒ์œ„ ๋น„ํŠธ๋ฅผ ์ฐพ๋Š”๋‹ค.
  7. LSB : ์ตœํ•˜์œ„ ๋น„ํŠธ๋ฅผ ์ฐพ๋Š”๋‹ค.

 

๐Ÿซง ๋น„ํŠธ๋งˆ์Šคํฌ(BitMask)

: ์—ฌ๋Ÿฌ ํ‘œํ˜„ ์‹œ ๋น„ํŠธ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์„ ์ค„์ด๊ณ  ํšจ์œจ์ ์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค

ex) ์ง‘ํ•ฉ {1,2,3,5}๊ฐ€ ์žˆ์„ ๋•Œ 11101๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๊ณ  ์ €์žฅํ•  ๋•Œ๋Š” 10์ง„์ˆ˜๋กœ 29๋ฅผ ์ €์žฅํ•˜๋ฉด ๋œ๋‹ค

: ๋ฐฐ์—ด์„ ์ด์šฉํ•  ํ•„์š”์—†์ด ์ •์ˆ˜ ํ•˜๋‚˜๋งŒ์œผ๋กœ ์ €์žฅ์ด ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค

728x90
๋ฐ˜์‘ํ˜•
Comments