문제풀이 루틴에 관한 글은
https://nodingco.tistory.com/23 <- 여기를 참고해주세요!
https://www.acmicpc.net/problem/10610
10610번: 30
어느 날, 미르코는 우연히 길거리에서 양수 N을 보았다. 미르코는 30이란 수를 존경하기 때문에, 그는 길거리에서 찾은 수에 포함된 숫자들을 섞어 30의 배수가 되는 가장 큰 수를 만들고 싶어한
www.acmicpc.net
1. 이해 (5분) - 1분
문제에서 제시하는 조건은 30의 배수이지만, 사실상 3의 배수라고 생각을 해도 무방합니다.
3의 배수가 갖는 특징은 자릿수의 숫자를 모두 더하면 3의 배수가 나온다는 점입니다.
3, 6, 9, 12(3), 15(6)... 10진법에서 올림연산이 발생할때 3의 경우는 무조건 1만큼이 부족하기 때문에 앞의 자릿수는 1이 오르고 자기 자릿수에선 1만큼이 부족해지면서 합이 유지되는겁니다.
2. 계획 (5분) - 1분
문제에선 3의 배수가 아닌 30의 배수를 요구했으므로, 최소한 한개의 0이 필요합니다.
또한 가장 큰 수를 출력하라고 했으니 각 자리의 숫자들을 내림차순으로 정렬해 출력할 필요도 있겠네요.
다만 이 모든 계산은 이렇게 만들어진 수가 30의 배수일 경우, 즉 각 자릿수의 합이 3의 배수일 때만 해주면 됩니다.
3. 검증 (5분) - 1분
예외가 발생할 경우는 0 같은 특이한 수가 입력될때일텐데요, 조건에서 숫자가 0으로 시작하지 않는다고 하니 문제되지 않을것 같습니다.
각 자리의 숫자들을 내림차순으로 정렬한 수(만들 수 있는 가장 큰 수)도 3의 배수가 맞을까요?
예시를 떠올려보면 12345이나 54321이나 전부 3의 배수입니다! 각 자릿수의 합이 3의 배수기만 하면 전부 3의 배수인게 확실합니다.
4. 풀이 (30분) - 10분
오랜만에 Python을 사용하다보니 살짝 버벅였지만 작성에 크게 어려운 부분은 없었습니다.
짧은 코드인데도 시간이 꽤 걸렸네요.
5. 채점, 디버깅 (+@)
3의 배수가 갖는 특징을 알고 Python 언어를 알면 쉽게 풀 수 있는 문제여서 한번에 통과했습니다.
문제 풀이에는 총 15분 가량이 걸렸습니다.
정답코드입니다.
N = list(input())
N = sorted(N, reverse=True)
if N[-1] != '0' :
print(-1)
else:
sum = 0
for i in N:
sum += int(i)
if sum % 3 != 0 :
print(-1)
else :
print(''.join(N))
'🔍 알고리즘 > 백준 Python' 카테고리의 다른 글
[Python] 백준 1303번. 전쟁-전투 (실버1) (0) | 2022.09.13 |
---|---|
[Python] 백준 1026번. 보물 (실버2) (0) | 2022.06.30 |
[Python] 백준 9084번. 동전 (골드 5) (0) | 2022.01.26 |
[Python] 백준 15810번. 풍선공장 (실버2) (0) | 2022.01.13 |