멋쟁이v의 개발일지

[백준 10610번] 30 (파이썬) 본문

0년차/알고리즘(그리디)

[백준 10610번] 30 (파이썬)

멋쟁이v 2022. 11. 21. 17:59
728x90
320x100
문제
어느 날, 미르코는 우연히 길거리에서 양수 N을 보았다. 미르코는 30이란 수를 존경하기 때문에, 그는 길거리에서 찾은 수에 포함된 숫자들을 섞어 30의 배수가 되는 가장 큰 수를 만들고 싶어한다.

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

 

입력
N을 입력받는다. N는 최대 10⁵개의 숫자로 구성되어 있으며, 0으로 시작하지 않는다.
출력
미르코가 만들고 싶어하는 수가 존재한다면 그 수를 출력하라. 그 수가 존재하지 않는다면, -1을 출력하라.

 

예제 입력 1
102
예제 출력 1
210

 

예제 입력 2
2931
예제 출력 2
-1

 


 

풀이
이 문제는 제시된 숫자들을 섞에서 30의 배수가 되는 가장 큰 수를 만들면 됩니다.
30배수는 10배수와 3배수의 조합으로 생각할 수 있는데요.
먼저 10배수라면 0으로 떨어져야 하므로 끝자리가 0이 되야 합니다.(입력된 수에 0이 있는지 확인)
그리고 3배수는 각 자리수의 합이 3배수가 되어야 합니다.

예제 1
102이 입력되면 가장 큰 수를 만든다고 했을 때 맨 앞자리는 가장 큰 수가 와야합니다.
정렬을 했을 때 210이고 10의 배수이고 각 자리 수의 합이 3이 됩니다.
정답 : 210

예제 2
2931이 입력되고 정렬을 했을 때 9321입니다.
끝자리가 1이므로 10의 배수가 안됩니다.
정답 : -1

코드를 순서대로 작성한다면
1. 문자형태로 입력
2. 큰 수부터 차례로 정렬
3. 10의 배수가 아니라면(입력된 문자에 0이 없다면) -1 출력
4. 10의 배수라면 각 자리수의 합을 변수에 저장
5. 저장된 변수가 3의 배수가 아니라면 -1 출력
6. 3의 배수라면 join값을 사용해서 각 문자를 붙여서 출력


작성 코드
N = input()
N = sorted(N, reverse = True)

if '0' not in N: # 0이 없으면
    print(-1)
    
else:
    sum = 0 # 더한 값을 저장 할 변수
    for i in N: 
    	sum += int(i) # 각 자리 수의 값을 더함
        
    if sum % 3 != 0: # 더한 값이 3의 배수가 아니라면 -1 출력
        print(-1)
    else:
        print(''.join(N)) # 문자를 이어 붙여서 출력
728x90
320x100
Comments