본문 바로가기
Algorithm/LeetCode

[Java] 67. Add Binary

by tabasco 2023. 6. 8.

문제 설명 :

문자열로 구성된 두 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