CS/BOJ

[BOJ, Python] 10610번 : 30

아이스얼그레이 2022. 4. 20. 16:33

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

 

10610번: 30

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

www.acmicpc.net

 

문제

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

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

입력

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

출력

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

 

풀이

이 문제는 3의 배수의 성질을 알아야 해결할 수 있습니다. 처음에 좀 헤맸는데, 3의 배수는 각 자리수를 모두 더해을 때 3의 배수가 된다는 것을 알고나면 쉽게 해결 할 수 있습니다.

 

30의 배수가 되어야하기 때문에 입력받은 숫자(문자열 형태로 받습니다.)에 '0'이 포함되어 있지 않다면 바로 -1을 출력해야합니다. 그게 아닌 경우는 3의 배수인지 아닌지 판별합니다. 3의 배수라면 내림차순으로 정렬하기만 하면 가장 큰 3의 배수가 됩니다.

 

이때 30의 배수인지 판별하지 않는 이유는 숫자에 0이 포함되어있고 3의 배수라면 내림차순 정렬했을 때 당연히 30의 배수가 되기 때문입니다.

N = input()
N = sorted(N, reverse = True)
# 합이 3의 배수인지 확인하기 위해 정수로 이루어진 N_int라는 list를 선언했습니다.
N_int = [ int(n) for n in N ]

if '0' not in N:
    print(-1)
else:
    if sum(N_int) % 3 != 0:
        print(-1)
    else:
    	# 숫자에 0이 포함되어있고, 3의 배수인 경우에 내림차순한 문자열을 join으로 합쳐서 출력합니다.
        print("".join(N))