Lv 0. 이진수 더하기. *다시 풀어보기*

https://school.programmers.co.kr/learn/courses/30/lessons/120885

 

#include <string>
#include <vector>
#include <iostream>
#include <cmath>
#include <algorithm>

using namespace std;

int ten(int n){
    int i=0;
    int num =0;
    while(n>0){
        int c= (n%10)*pow(2,i);
        n/=10;
        num+=c; 
        i++;
    }
    return num;
}

string binary(int n){
    string num="";
    if(n==0) return "0";
    while(n>0){
        num+=to_string(n%2);    
        n/=2;
    }
    reverse(num.begin(),num.end());
    return num;
}

string solution(string bin1, string bin2) {
    string answer = "";
    int a= stoi(bin1);
    int b= stoi(bin2);
    int c= ten(a)+ten(b);
    answer=binary(c);
    return answer;
}

 

처음 생각한 방향이,

이진수의 string 으로 주어진 수를, int 로 바꾼뒤에, 해당 수를 10진수로 바꾸어서 서로 더하고, 

해당 10진수로 나타내어진 수를 2진수로 바뀌어진 역전된 형태의 string으로 나타낸뒤, 그 결과를 마지막에 reverse() 해주어서

출력하는 형태로 작성하였고, 만약 두 수 모두 0이면, 이진수로 표현할때의 예외처리를 해주어서 string이 "0" 이 되도록 처리해주었다. 

예외처리를 제대로 신경써주지 않아서 두 수 모두 0인 경우를 제대로 고려해주지 않으면 통과하지 못하는 문제였다. 

더욱 간단한 내장함수들이 있을것이라는 생각이 들었는데, 해당 내장함수들이 떠오르지 않아서 내가 아는 선에서 문제를 해결하였다. 

 

다른 사람의 풀이를 보니까, 아래 첨부할 풀이가 가장 최상단에 좋아요 수가 가장 많은 풀이로 올라와 있었는데, 아직 비트들끼리의 연산에 대해서 제대로 이해가 부족해서 그런지 바로 이해가 되지 않는 형태였다. 

#include <bits/stdc++.h>
using namespace std;

string solution(string bin1, string bin2) {
    int a = 0, b = 0;
    for (auto ch : bin1) a = a << 1 | ch - 48;
    for (auto ch : bin2) b = b << 1 | ch - 48;

    string ret;
    for (int n = a + b; n; n >>= 1) ret = char(n % 2 + 48) + ret;

    return ret.empty() ? "0" : ret;
}

 

이해를 돕기위해 gpt에 해석을 검색해보았다. 

이 C++ 코드는 두 개의 이진 문자열 `bin1` 및 `bin2`을 입력으로 받아서 그들의 이진 합을 문자열로 반환합니다.

코드 작동 방식을 아래에서 설명합니다:

1. `a`와 `b` 두 정수를 0으로 초기화합니다. 이들은 이진 문자열의 십진 값 저장에 사용됩니다.

2. 코드는 `for` 루프를 사용하여 `bin1`과 `bin2`를 문자별로 처리합니다. 각 반복에서 다음 작업이 수행됩니다:
   - `for (auto ch : bin1)`는 `bin1`의 각 문자를 반복합니다.
   - `ch - 48`은 문자 '0' 또는 '1'을 해당하는 숫자 값 (0 또는 1)으로 변환합니다.
   - `a = a << 1 | ch - 48`는 `a`의 비트를 왼쪽으로 한 위치 이동시키고 (2로 곱하기와 동일), 현재 문자의 숫자 값을 더합니다.

3. 코드는 두 십진 값 `a`와 `b`의 합을 계산하고 그 값을 정수 `n`에 저장합니다.

4. 결과 문자열 `ret`은 빈 문자열로 초기화됩니다.

5. 코드는 루프에 진입하고, 십진 합 `n`을 다시 이진으로 변환합니다:
   - `n >>= 1`는 `n`의 비트를 오른쪽으로 한 위치 이동시킵니다 (2로 나누는 것과 동일).
   - `char(n % 2 + 48)`는 `n`의 가장 낮은 자릿수를 계산하고 (0 또는 1), 이를 다시 문자로 변환합니다 ('0' 또는 '1').
   - `ret = char(n % 2 + 48) + ret`는 이 문자를 `ret` 문자열의 앞에 추가합니다.

6. 루프는 `n`이 0이 될 때까지 계속됩니다. 이는 이진 변환이 완료되었음을 의미합니다.

7. 마지막으로, `ret`이 비어 있는지 확인합니다. 만약 비어 있다면, 합이 0이었다는 것을 의미하므로 "0"을 반환합니다. 그렇지 않으면 계산된 이진 합을 문자열로 반환합니다. 이 코드는 효율적으로 이진 수를 변환하고 더하며 결과를 다시 이진으로 변환합니다.

위의 내용을 참고해서 해당 코드에 대해서 더욱 이해해보는 시간을 갖도록 하자. 

 

'알고리즘 > 프로그래머스' 카테고리의 다른 글

Lv 0. k의 개수  (0) 2023.10.12
Lv 0. A로 B 만들기  (0) 2023.10.11
Lv 0. 치킨 쿠폰. *다시 풀어보기*  (0) 2023.10.11
Lv 0. 로그인 성공?  (0) 2023.10.11
Lv 0. 옹알이 (1). *다시 풀어보기*  (0) 2023.10.11
  Comments,     Trackbacks