Skip to content

Commit fd60c6a

Browse files
committed
DaleStudy#284 Sum of Two Integers
1 parent eee706d commit fd60c6a

File tree

1 file changed

+109
-0
lines changed

1 file changed

+109
-0
lines changed

sum-of-two-integers/forest000014.java

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
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

Comments
 (0)