[그리디 알고리즘] ★ 10610번 - 30
[백준] 10610번 - 30
(풀이1) 정답 코드
1) 문제 해결 아이디어
해당 문제는 3의 배수임을 판별하는 조건을 알고 있으면 쉽게 풀 수 있는 문제였다.
배수 판별법에 따라 3의 배수는 각 자리의 숫자의 합이 3의 배수인 수이다.
<30의 배수가 되는 조건>
- 일의 자리수가 0
- 각 자리의 숫자들의 합이 3의 배수
일단 입력한 문자열을 리스트로 변환하여 내림차순 정렬하는 것이 포인트다.
30의 배수가 되는 조건 2개를 다 만족한다면 최댓값은 내림차순으로 정렬한 값이 될 것이다.
[참고] https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=sctivcrmnfe&logNo=220859963688
3. (2,3,4,5,6,8,9) 배수 판별법 및 증명-1
기본적인 배수 판별법이다. 2의 배수 판별법: 일의 자리수가 0,2,4,6,8 이면 2의 배수이다. 3의 배수 판별...
blog.naver.com
2) 소스코드
n = list(input())
n.sort(reverse=True) # 내림차순 정렬
sum = 0 # 자리수들의 합
# 자리수 합 구하기
for i in n:
sum += int(i)
# 자리수의 합이 3의 배수이고, 일의 자리수가 0이면
if(sum % 3 == 0 and "0" in n):
print(''.join(n))
else:
print(-1)
(풀이2) 메모리 초과된 실패 코드
1) 문제 해결 아이디어
처음 시도한 방법으로 메모리 초과가 되어 실패했다.
입력받은 문자열을 내림차순으로 정렬하고 맨 뒷자리가 0이면 0을 떼고 아니면 30의 배수가 될 수 없으므로 -1을 시키고 바로 종료한다. (0을 하나 떼서 테스트 케이스 수를 줄이기 위함)
permutations 라이브러리를 사용하여 순열을 리스트로 얻는다.
for문에서 리스트 안의 튜플을 문자열->정수형 변환한 후 3의 배수인지 검사하여 맞다면 바로 출력시키고 탈출한다. (아까 0을 제거했기 때문에 30의 배수가 아닌 3의 배수인지를 검토한다.) 마지막까지 해당 조건문을 만족하지 못하면 -1을 출력 시킨다.
2) 소스코드
from itertools import permutations
n = str(input()) # 양수 n
n = ''.join(sorted(n, reverse=True)) # 내림차순 정렬
# 맨 마지막 인덱스가 0이 아니면 종료
if(n[len(n) - 1] != "0"):
print("-1")
exit()
# 뒤에 0 하나 제거
n = n[0:len(n)-1]
# 순열 리스트 (nPn = n!)
arr = list(map(''.join, permutations(n, len(n))))
for i in range(len(arr)):
# 튜플을 문자열로 변환
#num = ''.join(arr[i])
# 탈출 조건
if( int(arr[i]) % 3 == 0):
print(arr[i] + "0")
break
if(i == len(arr) - 1):
print(-1)
break
Python에서 튜플을 문자열로 변환
이 튜토리얼은 파이썬에서 튜플을 문자열로 변환하는 방법을 보여줍니다.
www.delftstack.com