[Leetcode/C++] 371_Sum of Two Integers

이수진·2022년 1월 18일
0

먼저 문제는 다음과 같습니다.

첫 번째 풀이는 stl을 이용하지 않은 풀이입니다.
말 그대로, 두 a, b에 대하여 비트 단위로 계산을 하고,
carry발생 시에는 carry도 함께 계산하면서 이를 길이가 32인 int형 배열에 담았습니다.

그리고 마지막에는 비트가 들어있는 배열의 값을 직접 값으로 환산해주었습니다.

조금 신경써야했던 부분이 있다면,
비트의 값을 볼 때, 모두 a와 b의 비교하는 비트가 모두 0인 경우 그리고 1인 경우를 나누는 조건입니다.

  • a, b의 비교하는 비트의 자리가 모두 0일때: if(!(a&res) && !(b&res)) {..}
  • a, b의 비교하는 비트의 자리가 모두 1일때: if((a&res)!=0 && (b&res)!=0) {..}

이 부분만 신경쓴다면 크게 어렵지 않게 풀 수 있는 것 같습니다!

전체 풀이는 다음과 같습니다.

class Solution {
public:
    int getSum(int a, int b) {
        int res=1;
        int arr[32]={0, };
        int carry=0;
        
        for(int i=0; i<32; i++){
            // 0 0
            if(!(a&res) && !(b&res)){
                arr[i]=carry;
                carry=0;
            }
            // 1 1
            else if((a&res)!=0 && (b&res)!=0){
                if(carry) arr[i]=1;
                else arr[i]=0;
                
                carry=1; // 캐리 발생
            }
            // 0 1 또는 1 0
            else{
                if(carry){
                    arr[i]=0;
                    carry=1;
                }
                else{
                    arr[i]=1;
                    carry=0;
                }
            }
            if(i==31) break;
            res = res << 1;
        } // for문 끝
        
        
        res=1;
        int sum=0;
        for(int i=0; i<32; i++){
            sum+=res*arr[i];
            if(i==31) break;
            res = res << 1; // res*=2; 와 동일
        }
        
        return sum;
    }
};

아앗 문제를 다시 읽어보니,
+와 - 연산자를 이용하면 안됬었네요

그래서 마지막 부분만 다시 수정했습니다!

마지막에서 누적 합을 더해가는 과정에서

sum += res*arr[i]; 

이 부분을 |(OR)연산자를 이용하여

sum = sum | res*arr[i];

로 바꾸었습니다!

그래서 최종 코드는 다음과 같습니다.

class Solution {
public:
    int getSum(int a, int b) {
        int res=1;
        int arr[32]={0, };
        int carry=0;
        
        for(int i=0; i<32; i++){
            // 0 0
            if(!(a&res) && !(b&res)){
                arr[i]=carry;
                carry=0;
            }
            // 1 1
            else if((a&res)!=0 && (b&res)!=0){
                if(carry) arr[i]=1;
                else arr[i]=0;
                
                carry=1; // 캐리 발생
            }
            // 0 1 또는 1 0
            else{
                if(carry){
                    arr[i]=0;
                    carry=1;
                }
                else{
                    arr[i]=1;
                    carry=0;
                }
            }
            if(i==31) break;
            res = res << 1;
        } // for문 끝
        
        
        res=1;
        int sum=0;
        for(int i=0; i<32; i++){
            sum = sum | res*arr[i];
            if(i==31) break;
            res = res << 1; // res*=2; 와 동일
        }
        
        return sum;
    }
};

profile
꾸준히, 열심히, 그리고 잘하자

0개의 댓글