|
| 1 | +# https://leetcode.com/problems/sum-of-two-integers/ |
| 2 | + |
| 3 | +class Solution: |
| 4 | + def getSum(self, a: int, b: int) -> int: |
| 5 | + """ |
| 6 | + [Complexity] |
| 7 | + - TC: O(1) |
| 8 | + - SC: O(1) |
| 9 | +
|
| 10 | + [Approach] |
| 11 | + ๋ง์
๊ตฌํ ์ ์ฃผ์ํ ์์๋ carry์ value ๊ฐ์ด๋ค. |
| 12 | + ์๋ฅผ ๋ค์ด ์ด์ง์ 11๊ณผ 101์ ๋ง์
์ ์๊ฐํด๋ณด๋ฉด, ๊ฐ ์๋ฆฌ์์ ๋ฐ์ํ๋ carry์ value๋ ๋ค์๊ณผ ๊ฐ๋ค. |
| 13 | + a = 0 1 1 |
| 14 | + b = 1 0 1 |
| 15 | + --------------- |
| 16 | + value) 1 1 0 (= a ^ b) |
| 17 | + carry) 0 0 1 (= a & b) |
| 18 | + ์ด๋, ์ด๋ค ์๋ฆฌ์์ ๋ฐ์ํ carry๋ ํ ์นธ left shift ๋์ด ๋ค์ ๋ง์
์ ์ํํ๋ฏ ์ ์ฉ๋์ด์ผ ํจ์ ์ฃผ์ํ๋ค. |
| 19 | + value) 1 1 0 |
| 20 | + carry) 0 0 1 0 (<<= 1) |
| 21 | +
|
| 22 | + ์ด ๊ณผ์ ์ carry๊ฐ 0์ด ๋ ๋๊น์ง ๋ฐ๋ณตํด๋๊ฐ๋ค. |
| 23 | + value) 0 1 0 0 (= a ^ b) |
| 24 | + carry) 0 1 0 0 (= (a & b) << 1) |
| 25 | +
|
| 26 | + value) 0 0 0 0 (= a ^ b) |
| 27 | + carry) 1 0 0 0 (= (a & b) << 1) |
| 28 | +
|
| 29 | + value) 1 0 0 0 (= a ^ b) -> RESULT |
| 30 | + carry) 0 0 0 0 (= (a & b) << 1) -> END |
| 31 | +
|
| 32 | + ํ์ง๋ง ํ์ด์ฌ์์๋ int๋ฅผ 32bit ๋ณด๋ค ํฐ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๋ฏ๋ก ์์๊ฐ ๋ค์ด์ฌ ๊ฒฝ์ฐ์ ๋๋นํด ๋ค์์ ์์
์ ์ถ๊ฐ๋ก ์ํํด์ผ ํ๋ค. |
| 33 | + - ์์๊ฐ ๋ค์ด์จ๋ค๋ฉด carry๊ฐ 32bit๋ฅผ ๋์ด์๋ ๊ณ์ ๋ํด์ง ๊ฒ์ด๋ฏ๋ก, while ๋ฌธ ์กฐ๊ฑด์์์ carry์ 32bit masking์ ์ํํ๋ค. |
| 34 | + - (b & mask) == 0์ด์ง๋ง b > 0์ธ ๊ฒฝ์ฐ์๋ a์ 32bit ๋ฒ์ ๋ฐ์ overflow๊ฐ ์กด์ฌํ๋ ๊ฒ์ด๋ฏ๋ก, ๊ฒฐ๊ณผ ๊ฐ์๋ 32bit masking์ ์ํํ๋ค. |
| 35 | + """ |
| 36 | + |
| 37 | + mask = 0xffffffff # 32bit masking |
| 38 | + |
| 39 | + # carry๊ฐ 0์ด ๋ ๋๊น์ง ๋ฐ๋ณต (์์๊ฐ ๋ค์ด์ค๋ ๊ฒฝ์ฐ, 32bit masking ํ ํ์ธ) |
| 40 | + while (b & mask) != 0: |
| 41 | + a, b = a ^ b, (a & b) << 1 # value, carry |
| 42 | + |
| 43 | + return (a & mask) if b > 0 else a # ์์ (overflow) ์ฒ๋ฆฌ |
0 commit comments