본문 바로가기

백준 문제풀이

10610번: 30 / silver 4 / 정렬, 수학

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

 

10610번: 30

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

www.acmicpc.net

첫 시도 - 메모리 초과

'''
10610번: 30 / silver 4 /
'''
import itertools

# 1. n 입력 받기
n = input()
# 2. 각 숫자 arr 리스트에 넣고, 내림차순 정렬하기
arr = []
for v in n:
    arr.append(v)
arr.sort(reverse=True)

# 3. 30 배수 찾기
# 3-1. 0이 없으면 -1
if arr.pop() != '0':
    print(-1)
else:
    flag = True
    case = list(itertools.permutations(arr, len(arr)))
    for v in case:
        tmp = ''
        for i in v:
            tmp += i
        if int(tmp) % 3 == 0:
            print(tmp + '0')
            flag = False
            break
    if flag:
        print(-1)

 

정답 코드 

'''
10610번: 30 / silver 4 / 정렬, 수학
'''
# 1. n 입력 받고, 내림차순
n = list(input())
n.sort(reverse=True)
# 2. 30 배수 확인
n_sum = 0
for v in n:
    if v == '0':
        break
    n_sum += int(v)
if n[-1] != '0' or n_sum % 3 != 0:
    print(-1)
else:
    for i in n:
        print(i, end='')

 

3의 배수 판정을 이해 해야 풀 수 있는 문제

 

3의 배수 판정: 각 자리 수의 합이 3의 배수인 수이다.

 

처음 짠 코드는 3의 배수 판정 조건을 몰라서 모두 하나씩 집어 넣어서 3의 배수인지 확인을 했다.