https://www.acmicpc.net/problem/10610
문제
어느 날, 미르코는 우연히 길거리에서 양수 N을 보았다. 미르코는 30이란 수를 존경하기 때문에, 그는 길거리에서 찾은 수에 포함된 숫자들을 섞어 30의 배수가 되는 가장 큰 수를 만들고 싶어한다.
미르코를 도와 그가 만들고 싶어하는 수를 계산하는 프로그램을 작성하라.
입력
N을 입력받는다. N는 최대 105개의 숫자로 구성되어 있으며, 0으로 시작하지 않는다.
출력
미르코가 만들고 싶어하는 수가 존재한다면 그 수를 출력하라. 그 수가 존재하지 않는다면, -1을 출력하라.
풀이
이 문제는 3의 배수의 성질을 알아야 해결할 수 있습니다. 처음에 좀 헤맸는데, 3의 배수는 각 자리수를 모두 더해을 때 3의 배수가 된다는 것을 알고나면 쉽게 해결 할 수 있습니다.
30의 배수가 되어야하기 때문에 입력받은 숫자(문자열 형태로 받습니다.)에 '0'이 포함되어 있지 않다면 바로 -1을 출력해야합니다. 그게 아닌 경우는 3의 배수인지 아닌지 판별합니다. 3의 배수라면 내림차순으로 정렬하기만 하면 가장 큰 3의 배수가 됩니다.
이때 30의 배수인지 판별하지 않는 이유는 숫자에 0이 포함되어있고 3의 배수라면 내림차순 정렬했을 때 당연히 30의 배수가 되기 때문입니다.
N = input()
N = sorted(N, reverse = True)
# 합이 3의 배수인지 확인하기 위해 정수로 이루어진 N_int라는 list를 선언했습니다.
N_int = [ int(n) for n in N ]
if '0' not in N:
print(-1)
else:
if sum(N_int) % 3 != 0:
print(-1)
else:
# 숫자에 0이 포함되어있고, 3의 배수인 경우에 내림차순한 문자열을 join으로 합쳐서 출력합니다.
print("".join(N))
'CS > BOJ' 카테고리의 다른 글
[BOJ, Python] 1763번 : 듣보잡 (0) | 2022.04.21 |
---|---|
[BOJ, Python] 13015번 : 별 찍기 - 23 (0) | 2022.04.20 |
[BOJ, Python] 10996번 : 별 찍기 - 21 (0) | 2022.04.20 |
[BOJ, Python] 2941번 : 크로아티아 알파벳 (0) | 2022.04.20 |
[BOJ, Python] 1316번 : 그룹 단어 체커 (0) | 2022.04.20 |