카테고리 없음

[백준 / python] 2729 이진수 덧셈

jnx 2023. 1. 31. 16:59

문제

이진수 덧셈은 매우 간단하고, 십진수 덧셈과 비슷하게 하면 된다. 십진수 덧셈을 할 때는, 오른쪽부터 왼쪽으로 차례대로 숫자 하나씩 더하면 된다. 이진수 덧셈도 이와 비슷하게 하면 된다. 십진수 덧셈은 외워야 할 덧셈이 많지만, 이진수 덧셈은 아래와 같이 5가지만 기억하면 된다.

  • 0 + 0 = 0
  • 1 + 0 = 1
  • 0 + 1 = 1
  • 1 + 1 = 10
  • 1 + 1 + 1 = 11

두 이진수가 주어졌을 때, 그 합을 이진수로 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 테스트 케이스의 수 T(1<=T<=1,000)가 주어진다. 각 테스트 케이스는 숫자 2개로 이루어져있다. 이 숫자는 0과 1로만 이루어진 이진수이며, 길이는 최대 80자리이다. (덧셈 결과는 81자리가 될 수도 있다) 이진수는 0으로 시작할 수도 있다.

출력

각 테스트 케이스에 대해 입력으로 주어진 두 이진수의 합을 구해 이진수로 출력한다. 숫자의 앞에 불필요한 0이 붙으면 안 된다.

코드

T = int(input())
ans_lst = []
for i in range(T):
  A, B = input().split()
  sum = list(str(int(A) + int(B)))

  while '2' in sum or '3' in sum: 
    for j in range(len(sum)):
      if sum[-(j+1)] == '2':
        sum[-(j+1)] = '0'
        if j+2 <= len(sum):
          sum[-(j+2)] = str(int(sum[-(j+2)]) + 1)
        if j+2 > len(sum):
          sum.insert(0, '1')
          
      if sum[-(j+1)] == '3': 
        sum[-(j+1)] = '1'
        if j+2 <= len(sum):
          sum[-(j+2)] = str(int(sum[-(j+2)]) + 1)
        if j+2 > len(sum):
          sum.insert(0, '1')
          
  ans = int(''.join(sum))
  ans_lst.append(ans)
  
print(*ans_lst, sep = '\n')

문제 풀이

1) 먼저 일반 덧셈으로 계산

2)  (1)(2)번은 일반 덧셈이랑 똑같고, (3)(4)번의 경우에만 이진수 덧셈 방식이다.  

(1) 0 + 0 = 0    (2) 1 + 0 = 1  (3) 1 + 1 = 10   (4) 1 + 1 + 1 = 11

3) (3)번은 원래 값이 2인데 10으로 바꾸고, (4)번도 원래 값 3을 11로 바꿔준다.

그러나 앞자리수로 넘어가는 것을 주의하여 바꿔준다.