# addStrings 함수가 두 개의 문자열로 표현된 값을 더해서 반환
def addStrings(num1: str, num2: str) -> str:
    res = []                    # 반환될 결괏값

    carry = 0                   # 받아올림수를 위한 변수    
    p1 = len(num1) - 1          # 첫 번째 문자열을 위한 인덱스 변수
    p2 = len(num2) - 1          # 두 번째 문자열을 위한 인덱스 변수

    while p1 >= 0 or p2 >= 0:
        x1 = ord(num1[p1]) - ord('0') if p1 >= 0 else 0   # num1의 p1번째 문자를 정수로 x1에 저장
        x2 = ord(num2[p2]) - ord('0') if p2 >= 0 else 0    # num2의 p2번째 문자를 정수로 x2에 저장 
        value = (x1 + x2 + carry) % 10    # x1+x2+carry에서의 받아올림수를 제외한 값 
        carry = (x1 + x2 + carry) // 10   # x1+x2+carry에서의 받아올림수
        res.append(value)                 # 결괏값 끝에 value를 추가
        p1 -= 1                                             
        p2 -= 1    
     
    # 받아올림수가 0이 아닐 때 결괏값 끝에 추가   
    if carry:
        res.append(carry)   
        
    # 결괏값을 역순으로 문자열로 바꾸고 반환 
    return ''.join(str(x) for x in res[::-1])                


# multiply 함수가 두 개의 문자열로 표현된 값을 곱해서 반환
def multiply(num1: str, num2: str) -> str:
    if num1 == "0" or num2 == "0":                          
        return "0"
    
    N = len(num1) + len(num2)           # 결과의 길이를 위한 변수
    answer = [0] * N                    # N개의 0으로 초기화된 배열
    first_number = num1[::-1]           # num1을 역순으로 저장
    second_number = num2[::-1]          # num2를 역순으로 저장
    
    # 해당 이중 for 문은 두 개의 정수에 대한 곱하기를 처리
    for place2, digit2 in enumerate(second_number):         
        for place1, digit1 in enumerate(first_number):
            # second_number[place2]*first_number[place1]의 결과가 저장될 answer의 인덱스값
            num_zeros = place1 + place2     
               
            carry = answer[num_zeros]    # 기존 answer[num_zeros]의 값을 받아올림수로 저장
            multiplication = int(digit1) * int(digit2) + carry 
           
            answer[num_zeros] = multiplication % 10    # multiplication에서의 받아올림수를 제외한 값
            
            answer[num_zeros + 1] += multiplication // 10      
    
    if answer[-1] == 0:                   # answer 안에 0인 원소들을 제거
        answer.pop()
        
    return ''.join(str(digit) for digit in reversed(answer))    # answer을 역순으로 바꾸고 문자열형으로 반환

def main():
    binary = input("2진수를 입력하시오: ")            
    binary = binary[::-1]                 # 이진수(문자열)를 역순으로 변경
    answer = "0"                                   
    multiplier = "1"                      # 각 비트를 곱하기 위한 변수
    
    for b in binary:
        if b == '1':      # 비트가 1일 때만 answer과 multiplier 값을 더함        
            answer = addStrings(answer, multiplier)
        multiplier = multiply(multiplier, "2")         # 매번 multiplier에 2를 곱함

    print("10진수: ", answer)                # 계산된 결과인 10진수를 출력


if __name__ == "__main__":                     # main 함수 호출
    main()
