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)
'알고리즘' 카테고리의 다른 글
[파이썬 | BOJ | 12790] Mini Fantasy War (0) | 2020.02.17 |
---|---|
[파이썬 | BOJ | 11048] 이동하기 (0) | 2020.02.14 |
[파이썬 | BOJ | 1057] 토너먼트 (0) | 2020.02.14 |
[파이썬 | BOJ | 2167] 2차원 배열의 합 (0) | 2020.02.13 |
[파이썬 | BOJ | 1094] 막대기 (0) | 2020.02.13 |