어느 날, 미르코는 우연히 길거리에서 양수 N을 보았다. 미르코는 30이란 수를 존경하기 때문에, 그는 길거리에서 찾은 수에 포함된 숫자들을 섞어 30의 배수가 되는 가장 큰 수를 만들고 싶어한다.
미르코를 도와 그가 만들고 싶어하는 수를 계산하는 프로그램을 작성하라.
입력
N을 입력받는다. N는 최대 105개의 숫자로 구성되어 있으며, 0으로 시작하지 않는다.
출력
미르코가 만들고 싶어하는 수가 존재한다면 그 수를 출력하라. 그 수가 존재하지 않는다면, -1을 출력하라.
예제 입력 1 복사
30
예제 출력 1 복사
30
예제 입력 2 복사
102
예제 출력 2 복사
210
예제 입력 3 복사
2931
예제 출력 3 복사
-1
예제 입력 4 복사
80875542
예제 출력 4 복사
88755420
N이 주어졌을 때, N을 구성하는 숫자들을 조합해서 30의 배수가 되는 가장 큰 수를 반환하는 문제입니다.
이번 문제는 30의 배수 특징만 파악한다면 빠르게 해결이 가능할 것으로 보입니다. 우선, 입출력 조건을 살펴보겠습니다.
바로 문제를 분석하러 가보겠습니다.
이번 문제의 핵심은 30의 배수의 특징을 파악하고 이를 활용하여 최적의 해결책을 도출하는 것입니다. 문제를 효율적으로 해결하기 위해 다음과 같은 접근 방법을 사용할 수 있습니다.
30의 배수의 특징
1
을 반환하면 됩니다.1
을 반환합니다.102
를 내림차순 정렬하면 210
, 80875542
를 내림차순 정렬하면 88755420
이 됩니다.알고리즘 설계
위 특징을 기반으로, 문제를 해결하는 과정을 단계별로 나누어 설계합니다:
1
을 반환합니다.1
을 반환합니다.그리디 알고리즘으로 해결
이 문제는 그리디 알고리즘으로 해결할 수 있습니다. 그리디 알고리즘은 "매 순간 최적의 선택을 하여 문제를 해결하는 방법"입니다.
따라서, 이 문제는 그리디 알고리즘의 특성을 잘 활용한 문제라고 볼 수 있습니다.
코드 설계까지 문제를 제대로 분석한다면 쉽게 이뤄질 수 있습니다. 이제 코드를 보도록 하겠습니다.
import sys
N = sys.stdin.readline().strip()
def sol(N):
num_sum = 0
if '0' not in N:
return -1
for i in N:
num_sum += int(i)
if num_sum % 3 != 0:
return -1
return ''.join(sorted(N,reverse=True))
print(sol(N=N))
코드 설명:
N
을 문자열로 받아옵니다. 문자열로 처리하면 각 자릿수를 쉽게 접근할 수 있고, 정렬 작업도 간단히 수행할 수 있습니다.N
에 '0'
이 포함되지 않으면 30의 배수를 만들 수 없습니다. 따라서 '0' not in N
조건을 통해 False
인 경우 바로 1
을 반환합니다.1
을 반환합니다.sorted(N, reverse=True)
를 사용하여 숫자를 내림차순으로 정렬합니다.''.join()
으로 연결하여 가장 큰 30의 배수를 만듭니다.시간 복잡도:
'0' not in N
은 문자열 N
의 길이만큼 확인하므로 입니다.sorted
함수는 입니다.따라서, 전체 시간 복잡도는 입니다.
결과:
이 문제는 30의 배수 조건을 활용하여 문제를 간단히 해결할 수 있는 그리디 알고리즘 문제입니다. 중요한 점은 조건을 만족하는지 확인한 후, 내림차순 정렬을 통해 가장 큰 값을 만드는 것입니다.
이번 문제를 통해 조건을 활용한 문제 단순화와 정렬을 활용한 그리디 접근법을 연습할 수 있었습니다!
전체 코드는 다음 링크에서 확인할 수 있습니다.
읽어주셔서 감사합니다!