Algorithm/Greedy

[백준] 10610. 30 / 파이썬(python)

Dev_Green 2022. 4. 23. 23:31

문제

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

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

입력

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

문제 파악

먼저 3의 배수의 특성에 대해 알고 있어야 한다. 

3의 배수는 각 자리 숫자의 합이 3의 배수여야 한다.

더불어 문제의 조건은 30의 배수이기 때문에 아래 두 가지 조건에 만족하여야 한다. 

1. 각 자리 숫자의 합이 3이다.

2. 일의 자리 숫자가 0이다.

 

위 조건들을 만족하는 수 중 최댓값을 찾고 있으므로 문자열로 받은 n을 내림차순으로 정리한다.

 

if 문을 사용하여 위에 제시하였던 조건 두 가지에 대한 검증을 진행한다. 

두 조건을 동시에 만족해야 참이므로(즉, 두 조건 중 어느 하나라도 만족하지 못한다면 거짓이므로) "or"을 사용한다. 

 

조건들을 만족한다면 join 함수를 사용하여 공백 없이(작은 따옴표 두개) 각 문자형 요소들을 이어준다.

n = list(input())
n.sort(reverse=True)
sum  = 0
for i in n:
    sum += int(i)
if sum % 3 != 0 or "0" not in n:
    print(-1)
else:
    print(''.join(n))