문제 설명 :
문자열로 구성된 두 2진수를 2진법으로 계산하여 결과를 문자열로 출력하는 문제
class Solution {
public String addBinary(String a, String b) {
Stack<Character> stackA = new Stack<>();
Stack<Character> stackB = new Stack<>();
Stack<Character> stack = new Stack<>();
HashMap<String, Boolean> map = new HashMap<>();
StringBuffer buffer = new StringBuffer("");
for(int i=0; i<a.length(); i++){
stackA.push(a.charAt(i));
}
for(int i=0; i<b.length(); i++){
stackB.push(b.charAt(i));
}
boolean check = false;
while(!stackA.empty() && !stackB.empty()){
char charA = stackA.pop();
char charB = stackB.pop();
map = roundUpChk(charA, charB, check);
if(map.get("value")){
stack.push('1');
}else{
stack.push('0');
}
check = map.get("roundUp");
}
while(!stackA.empty()){
char charA = stackA.pop();
if(check && charA == '1'){
stack.push('0');
}else if(check && charA != '1'){
check = false;
stack.push('1');
}else{
stack.push(charA);
}
}
while(!stackB.empty()){
char charB = stackB.pop();
if(check && charB == '1'){
stack.push('0');
}else if(check && charB != '1'){
check = false;
stack.push('1');
}else{
stack.push(charB);
}
}
if(check) stack.push('1');
while(!stack.empty()){
buffer.append(stack.pop());
}
return buffer.toString();
}
private HashMap roundUpChk(char a, char b, boolean check){
HashMap<String, Boolean> map = new HashMap<>();
if(check){
if(a == '1' && b == '1'){
map.put("roundUp",true);
map.put("value",true);
}else if(a == '0' && b == '0'){
map.put("roundUp",false);
map.put("value",true);
}else{
map.put("roundUp",true);
map.put("value",false);
}
}else{
if(a == '1' && b == '1'){
map.put("roundUp",true);
map.put("value",false);
}else if(a == '0' && b == '0'){
map.put("roundUp",false);
map.put("value",false);
}else{
map.put("roundUp",false);
map.put("value",true);
}
}
return map;
}
}
해설 :
- Stack을 활용해서 주어진 문자열을 담고, pop하면서 별도로 생성한 roundUpChk함수에 한 문자씩 넘겨서 더한 결과를 값과 자리올림 여부로 return해주었다.
- return 결과 자리올림이 있다면, 다시 roundUpChk를 요청할 때, 자리올림이 있다고 check 라는 변수로 넘겨주어 그에 맞는 결과를 return하도록 하였다.
- 두 문자열 중 짧은 문자열의 stack이 모두 소진되면, 남은 문자열과 자리올림 여부를 확인해서 값을 더해주었고, 마지막에 자리올림이 생긴다면, 이때는 맨 앞에 1을 붙여주는 걸로 계산이 마무리 된다.
- 너무 직관적으로 푼것 같아서 더 좋은 방법이 있는지 다시 생각해봐야할 것 같다.
'Algorithm > LeetCode' 카테고리의 다른 글
[Java] 70. Climbing Stairs (2) | 2023.06.09 |
---|---|
[Java] 69. Sqrt(x) (0) | 2023.06.09 |
[Java] 66. Plus One (0) | 2023.06.08 |
[Java] 58. Length of Last Word (3) | 2023.06.08 |
[Java] 35. Search Insert Position (0) | 2023.06.08 |