KEEP GOING

[python] 백준 10610 : 30 본문

code review/greedy

[python] 백준 10610 : 30

jmHan 2022. 2. 10. 11:32
반응형

itertools 라이브러리의 permutations를 이용하여 문제를 해결하려 했지만 시간 초과가 발생하였다.

시간초과 문제를 해결하기 위해서는 30의 배수가 되는 수의 조건을 이해하고 있어야 했다. 

 

 

1. 30의 배수는 무조건 '0'을 포함하고 있다. ex) 30, 60, 90, ..

2. 30의 배수는 각 자리수의 합을 더한 값이 3의 배수가 된다. 270 => 2+7+0 = 9 % 3 == 0

 

 

1. 코드 구현

a = list(map(int, input()))
# 0을 포함하지 않거나 각 자리수의 합이 3의 배수가 아닌 경우 
if 0 not in a or sum(a) % 3 != 0:
    print(-1)
# 30의 배수 
else:
    # 내림차순 정렬 
    a.sort(key=lambda x:-x)
    data = ''.join(list(map(str, a)))
    print(data)

내림 차순 정렬을 해주는 이유는 문제에서 30의 배수가 되는 '가장 큰 수'를 구해달라고 하였기 때문이다. 

 

 

 

2. 시간 초과 발생한 코드

from itertools import permutations 

number = list(input())
n = len(number)
result = [-1]

# 순열을 이용하여 숫자 배치하기
for data in permutations(number, n):
    # 맨 앞 자리수가 0이 아닌 경우
    if data[0] != '0':
        # 숫자 생성 
        d = int(''.join(data))
        # 30의 배수인 경우 
        if d%30 == 0:
            result.append(d)
print(max(result))

 

 

만약 data = ['0','2','2']라면 d = '022'가 된다.

여기에 d의 타입을 str에서 int로 형변환해주면 맨앞 숫자가 0이라서 에러가 날것이라고 생각했다.

그래서 10번줄에서 if문으로 필터링을 걸어주었다.

하지만 확인해보니 d를 int로 형변환하면 에러없이 '022'에서 22로 숫자가 바뀐다는걸 알 수 있었다.  

test = ['0','2','2']
print(int(''.join(test)))

결과값

반응형
Comments