본문 바로가기

알고리즘

[파이썬 | BOJ | 10610] 30

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

 

10610번: 30

문제 어느 날, 미르코는 우연히 길거리에서 양수 N을 보았다. 미르코는 30이란 수를 존경하기 때문에, 그는 길거리에서 찾은 수에 포함된 숫자들을 섞어 30의 배수가 되는 가장 큰 수를 만들고 싶어한다. 미르코를 도와 그가 만들고 싶어하는 수를 계산하는 프로그램을 작성하라. 입력 N을 입력받는다. N는 최대 105개의 숫자로 구성되어 있으며, 0으로 시작하지 않는다. 출력 미르코가 만들고 싶어하는 수가 존재한다면 그 수를 출력하라. 그 수가 존재하지 않는

www.acmicpc.net

문제

어느 날, 미르코는 우연히 길거리에서 양수 N을 보았다. 미르코는 30이란 수를 존경하기 때문에, 그는 길거리에서 찾은 수에 포함된 숫자들을 섞어 30의 배수가 되는 가장 큰 수를 만들고 싶어한다.

미르코를 도와 그가 만들고 싶어하는 수를 계산하는 프로그램을 작성하라.

입력

N을 입력받는다. N는 최대 105개의 숫자로 구성되어 있으며, 0으로 시작하지 않는다.

출력

미르코가 만들고 싶어하는 수가 존재한다면 그 수를 출력하라. 그 수가 존재하지 않는다면, -1을 출력하라.

 

풀이

알고리즘 분류 : 수학

30의 배수를 만드는 것은 결국 5,6의 배수, 즉 2,3,5의 배수를 찾는것과 같다.

 

2의 배수의 특징 : 끝자리 수가 짝수

3의 배수의 특징 : 모든 자리수의 합이 3의 배수

5의 배수의 특징 : 끝자리가 5 or 0

 

따라서 30의 배수는, 끝자리가 0이면서, 모든 자리수의 합이 3의 배수인 수를 뜻한다.

 

따라서 입력받은 정수들의 string에서, 0은 하나 이상 포함되어 있어야하며, 모든 각 자리수의 합이 3의 배수일때만 30의 배수를 만들 수 있고, 그러한 30의 배수들 중에서 가장 큰 숫자는, 입력 받은 string을 내림차순으로 정렬한 것과 같다.

 

import sys
read = sys.stdin.readline

number = read().replace('\n', '')
number_sum = 0
for num in number:
    number_sum += int(num)
if number.count('0') == 0 :
    print(-1)
elif number_sum % 3 != 0 :
    print(-1)
else:
    ans = ''.join(sorted(number, reverse=True))
    print(ans)