알고리즘/백준

백준 | 10610 - 30 (python)

유하 yuha 2021. 10. 7. 18:29

3️⃣ 30

숫자들을 조합해서 30의 배수를 만들어야 한다.

3의 배수 특징을 알게 된다면 더 쉽게 풀 수 있는 문제였다. (몰라서 중간에 포기했었다..)

 

 


✏️ 문제

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

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

 

입력

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

 

출력

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

 

 


💡 해결방법

시간 초과한 방법

숫자의 배열에 0이 없다면 30의 배수가 될 수 없으므로 -1을 출력한다. 만약 0이 있다면 0을 제외한 모든 수를 큰 수부터 배열한 뒤 3의 배수가 된다면 0을 붙여 출력한다.

-> 숫자가 크다면 정렬해야하는 시간이 길어서 초과함

 

어떻게 하면 해결할 수 있을지 고민하다가 3의 배수 특성을 찾게 되었다. 모든 숫자의 합이 3의 배수라면 그 수는 3의 배수라는 특징이 있다. 즉, 숫자에 0이 있을 경우 모든 숫자의 합이 3의배수라면 숫자를 가장 큰 수부터 정렬했을 때의 값은 3의 배수이다.

만약 0이 없다면 -1을 출력한다.

0이 있을 경우 모든 숫자를 합한 뒤 3의 배수라면 가장 큰 수부터 정렬하고 출력하고 3의 배수가 아니라면 -1을 출력한다.

숫자가 3의 배수가 아니라면 그 수는 어떻게 배열을 해도 3의 배수가 될 수 없다. 즉 배열에 0이 포함되어 있을 때 숫자의 합이 3의 배수일 경우 가장 큰 값은 큰 수부터 정렬했을 때의 값이 될 수밖에 없다.

 

 

👩🏻‍💻 소스코드

import sys
n = list(map(int,sys.stdin.readline().rstrip().strip()))

if 0 not in n:
    print(-1)
else:
    if sum(n) % 3 == 0:
        n.sort(reverse=True)
        a = ''.join(map(str, n))
        print(a)
    else:
        print(-1)

 

 


 

 

 

10610번: 30

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

www.acmicpc.net

 

'알고리즘 > 백준' 카테고리의 다른 글

백준 | 2579 - 계단 오르기 (python)  (0) 2021.10.08
백준 | 2156 - 포도주 시식 (python)  (0) 2021.10.08
백준 | 10250 - ACM호텔 (Java)  (0) 2021.10.07
백준 | 2292 - 벌집 (Java)  (0) 2021.10.07
백준 | 10950 - A+B - 3 (Java)  (0) 2021.10.07