[백준][파이썬] 9440번. 숫자 더하기

문제

https://www.acmicpc.net/problem/9440

 

풀이

주어진 숫자를 오름차순으로 정렬한 후, 앞에서부터 하나씩 순서대로 num1과 num2로 나누어주었다.

예를 들어 [3, 4, 2, 2, 2, 2]가 주어졌을때 오름차순으로 정렬하면 [2, 2, 2, 2, 3, 4]이고, 앞에서부터 하나씩 num1과 num2로 나누어준다면 결과는 다음과 같다.

num1 = [2, 2, 3]

num2 = [2, 2, 4]

따라서 정답은 223 + 224 = 447이다.

 

이때 주어진 숫자에 0이 포함된 경우, 두 정수는 0으로 시작하면 안된다는 것에 유의해야 한다.

예를 들어 [0, 1, 2, 3, 4, 0, 1, 2, 3]이 주어졌다면, 오름차순으로 정렬 시 [0, 0, 1, 1, 2, 2, 3, 3, 4]이고, 앞에서부터 num1과 num2로 나누어주면 다음과 같은 결과가 나온다.

num1 = [0, 1, 2, 3, 4]

num2 = [0, 1, 2, 3]

 

이 경우를 해결하기 위해 먼저 0을 제외한 숫자들을 num1과 num2로 나누어주고, 마지막에 0을 앞에서부터 두 번째 자리에 끼워넣는 방식으로 접근했다.

이렇게 하면 [0, 1, 2, 3, 4, 0, 1, 2, 3]에서 0을 제외하고 오름차순으로 정렬한 [1, 1, 2, 2, 3, 3, 4]를 num1 = [1, 2, 3, 4], num2 = [1, 2, 3]으로 나누어 준 후, 0을 두 번째 자리에 끼워넣어 num1 = [1, 0, 2, 3, 4], num2 = [1, 0, 2, 3]으로 만들 수 있다.

 

while True :
  N, *nums = map(int, input().split())
  if not nums :
    break

  # nums에 포함된 0의 개수 세기
  count = nums.count(0)

  nums.sort()  # 오름차순 정렬
  num1 = []
  num2 = []
  for i in range(count, N) :  # nums[count:]는 모두 0이 아닌 정수
    if i % 2 == 0 :
      num1.append(nums[i])
    else :
      num2.append(nums[i])

  # 0 끼워주기
  for _ in range(count) :
    # 길이가 더 짧은 숫자에 0이 들어가야 가장 작은 수를 만들 수 있음
    if len(num1) < len(num2) :  
      num1.insert(1, 0)
    elif len(num1) > len(num2) :
      num2.insert(1, 0)
    else :  # num1과 num2의 길이가 같은 경우, 큰 자리수의 숫자가 작은 수에 0이 들어가야 함
      if num1 > num2 :
        num2.insert(1, 0)
      else :
        num1.insert(1, 0)

  print(int(''.join(map(str, num1))) + int(''.join(map(str, num2))))
728x90