|
| 1 | +/* |
| 2 | +# Time Complexity: O(n) |
| 3 | +# Space Complexity: O(1) |
| 4 | +
|
| 5 | +음...... bit manipulation을 최대한 활용해서 했습니다. |
| 6 | +이진법의 덧셈/뺄셈을 손으로 계산한다면, carry/borrow 개념을 활용해서 수행할 텐데, 이 과정을 그대로 코드로 옮겨보았습니다. |
| 7 | +++은 increment operator이고, -는 unary minus operator로만 썼으니, 문제의 조건인 +, - operator를 쓰지 말라는 제약사항은 지켰다고 주장하고 싶습니다. |
| 8 | +그런데 이렇게 지저분하게 구현하는 것은 출제자의 의도에 부합하지 않는 것 같네요. Dale님의 풀이를 보니 훨씬 간결하던데, 좀 더 공부해봐야 할 것 같습니다. |
| 9 | +*/ |
| 10 | + |
| 11 | +class Solution { |
| 12 | + public int getSum(int a, int b) { |
| 13 | + if (a >= 0 && b >= 0) { |
| 14 | + return sum(a, b); |
| 15 | + } else if (a <= 0 && b <= 0) { |
| 16 | + return -sum(-a, -b); |
| 17 | + } else if (a < 0) { |
| 18 | + if (-a >= b) { |
| 19 | + return -subtract(-a, b); |
| 20 | + } else { |
| 21 | + return subtract(b, -a); |
| 22 | + } |
| 23 | + } else { |
| 24 | + if (a >= -b) { |
| 25 | + return subtract(a, -b); |
| 26 | + } else { |
| 27 | + return -subtract(-b, a); |
| 28 | + } |
| 29 | + } |
| 30 | + } |
| 31 | + |
| 32 | + public int sum(int a, int b) { |
| 33 | + int sum = 0; |
| 34 | + int carry = 0; |
| 35 | + int bit = 0; |
| 36 | + int digit = 0; |
| 37 | + |
| 38 | + while (a > 0 || b > 0) { |
| 39 | + if (((a & 1) & (b & 1) & (carry & 1)) == 1) { |
| 40 | + carry = 1; |
| 41 | + bit = 1; |
| 42 | + } else if (((a & 1) | (b & 1) | (carry & 1)) == 1) { |
| 43 | + if (((a & 1) ^ (b & 1) ^ (carry & 1)) == 0) { |
| 44 | + carry = 1; |
| 45 | + bit = 0; |
| 46 | + } else { |
| 47 | + carry = 0; |
| 48 | + bit = 1; |
| 49 | + } |
| 50 | + } else { |
| 51 | + carry = 0; |
| 52 | + bit = 0; |
| 53 | + } |
| 54 | + |
| 55 | + sum |= (bit << digit); |
| 56 | + |
| 57 | + a >>= 1; |
| 58 | + b >>= 1; |
| 59 | + digit++; |
| 60 | + } |
| 61 | + |
| 62 | + if (carry == 1) { |
| 63 | + sum |= (1 << digit); |
| 64 | + } |
| 65 | + |
| 66 | + return sum; |
| 67 | + } |
| 68 | + |
| 69 | + public int subtract(int a, int b) { |
| 70 | + int sub = 0; |
| 71 | + int borrow = 0; |
| 72 | + int bit = 0; |
| 73 | + int digit = 0; |
| 74 | + |
| 75 | + while (a > 0) { |
| 76 | + if (borrow == 1) { |
| 77 | + if ((a & 1) == (b & 1)) { |
| 78 | + borrow = 1; |
| 79 | + bit = 1; |
| 80 | + } else if ((a & 1) == 1) { |
| 81 | + borrow = 0; |
| 82 | + bit = 0; |
| 83 | + } else { |
| 84 | + borrow = 1; |
| 85 | + bit = 0; |
| 86 | + } |
| 87 | + } else { |
| 88 | + if ((a & 1) == (b & 1)) { |
| 89 | + borrow = 0; |
| 90 | + bit = 0; |
| 91 | + } else if ((a & 1) == 1) { |
| 92 | + borrow = 0; |
| 93 | + bit = 1; |
| 94 | + } else { |
| 95 | + borrow = 1; |
| 96 | + bit = 1; |
| 97 | + } |
| 98 | + } |
| 99 | + |
| 100 | + sub |= (bit << digit); |
| 101 | + |
| 102 | + digit++; |
| 103 | + a >>= 1; |
| 104 | + b >>= 1; |
| 105 | + } |
| 106 | + |
| 107 | + return sub; |
| 108 | + } |
| 109 | +} |
0 commit comments