|
| 1 | +/** |
| 2 | + * ํ์ด |
| 3 | + * - ๋ ์ ์๋ฅผ ํ bit์ฉ ๋ํ๋ ๋ฐฉ์์ผ๋ก ํ์ดํฉ๋๋ค |
| 4 | + * - ๋ ์ ์์ ๋ํด ์ด์ง ๋ง์
์ ์งํํ ๋, ํด๋น ์๋ฆฌ์์ bit ๋ ๊ฐ์ carry๋ฅผ ๋น๊ตํ์ฌ ์๋ก์ด carry์ ํด๋น ์๋ฆฌ์์ ๋ง์
๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค -> adder ํจ์ ์ฐธ๊ณ |
| 5 | + * - ๊ฐ ๋นํธ์ ๋ํด adder ํจ์๋ฅผ ํธ์ถํ์ฌ ๋ง์
์ ์งํํฉ๋๋ค |
| 6 | + * - res์ ํน์ ์๋ฆฌ์ ๋ง์
๊ฒฐ๊ณผ๋ฅผ ๋ฃ์ด์ฃผ๋ ๊ฒ์ด ๊น๋ค๋ก์ ๋๋ฐ, position์ด๋ผ๋ ์ผ์ข
์ bitmask๋ฅผ ์ฌ์ฉํ์ฌ ํด๊ฒฐํ ์ ์์์ต๋๋ค |
| 7 | + * - ์ ๋ Nand2Tetris ๋ผ๋ ์ฑ
/๊ฐ์๋ฅผ ๋ณด๋ฉด์ ์ด ์ ์ bitwise ์ฐ์ ์ฐ์ฐ๊ธฐ๋ฅผ ๊ตฌํํ ์ ์ด ์์๋๋ฐ, ๊ทธ ๊ฒฝํ์ด ํฐ ๋์์ด ๋์์ต๋๋ค |
| 8 | + * ๊ถ๊ธํ์ ๋ถ๋ค๊ป coursera ๊ฐ์ ๋งํฌ๋ฅผ ์ฒจ๋ถํฉ๋๋ค (๋ฌด๋ฃ) (https://www.coursera.org/learn/build-a-computer) (2๊ฐ์ ๋์ด) |
| 9 | + * |
| 10 | + * Big O |
| 11 | + * - N: a์ b ์ค ํฐ ์์ ๋นํธ ์ <= 32 (c++ ๊ธฐ์ค) |
| 12 | + * |
| 13 | + * - Time complexity: O(N <= 32) = O(1) |
| 14 | + * - Space complexity: O(1) |
| 15 | + */ |
| 16 | + |
| 17 | +class Solution { |
| 18 | +public: |
| 19 | + // returns {carry, result} |
| 20 | + // carry์ result๋ฅผ ์๋์ ๊ฐ์ bool ์ฐ์ฐ์ผ๋ก ํํํ ์ ์๋ค๋ ์ฌ์ค์ |
| 21 | + // x, y, c์ ๋ํ์ฌ ๋ฒค ๋ค์ด์ด๊ทธ๋จ์ ๊ทธ๋ ค๋ณด๋ฉด ์ฝ๊ฒ ํ์
ํ ์ ์์ต๋๋ค |
| 22 | + pair<bool, bool> adder(bool x, bool y, bool c) { |
| 23 | + return {(x & y) | (x & c) | (y & c), x ^ y ^ c}; |
| 24 | + } |
| 25 | + |
| 26 | + int getSum(int a, int b) { |
| 27 | + bool carry = 0; |
| 28 | + unsigned int res = 0; |
| 29 | + unsigned int position = 1; |
| 30 | + |
| 31 | + // 32 ๋นํธ ์ ์ ๋ฒ์ ๋ด์์ ๋ง์
์ ์งํํฉ๋๋ค |
| 32 | + // 32 ๋นํธ ๋ชจ๋ ๋ง์
์ ์งํํ๊ฑฐ๋, ๋ ๋ํ ๋นํธ๊ฐ ์๋ค๋ฉด ๋ฃจํ๋ฅผ ์ข
๋ฃํฉ๋๋ค |
| 33 | + while (position && (a || b || carry)) { |
| 34 | + bool lsb_a = a & 1; |
| 35 | + a >>= 1; |
| 36 | + |
| 37 | + bool lsb_b = b & 1; |
| 38 | + b >>= 1; |
| 39 | + |
| 40 | + auto [new_carry, new_res] = adder(lsb_a, lsb_b, carry); |
| 41 | + |
| 42 | + carry = new_carry; |
| 43 | + if (new_res) res |= position; |
| 44 | + |
| 45 | + // position์ด unsigned int (32๋นํธ)์ด๋ฏ๋ก |
| 46 | + // bitwise left shift ์ฐ์ฐ์ 32๋ฒ ์ํํ๋ฉด 0์ด ๋จ |
| 47 | + // 1000 0000 0000 0000 0000 0000 0000 0000 => 0000 0000 0000 0000 0000 0000 0000 0000 |
| 48 | + // position์ด 0์ด ๋๋ฉด 32๋นํธ ๋ชจ๋ ๋ง์
์ ์๋ฃํ๋ค๋ ๋ป์ด๋ฏ๋ก loop๋ฅผ ์ข
๋ฃํจ |
| 49 | + position <<= 1; |
| 50 | + } |
| 51 | + |
| 52 | + return (int) res; |
| 53 | + } |
| 54 | +}; |
0 commit comments