성공 | 시도 3번
10610 : [그리디 알고리즘] 30(py)
문제 설명
어느 날, 미르코는 우연히 길거리에서 양수 N을 보았다. 미르코는 30이란 수를 존경하기 때문에, 그는 길거리에서 찾은 수에 포함된 숫자들을 섞어 30의 배수가 되는 가장 큰 수를 만들고 싶어한다.
미르코를 도와 그가 만들고 싶어하는 수를 계산하는 프로그램을 작성하라.
문제 분석
- 찾은 수에 포함된 숫자들을 섞어 30의 배수가 되는 가장 큰 수가 되어야 한다.
예) 찾은 수 : 102 → 1, 0, 2 → 큰 수 : 210
- 30은 3 * 10으로 나타낼 수 있고 30의 배수인 수는 3의 배수이자 10의 배수이어야 한다. 3의 배수인 수는 각 자릿수를 더했을 때도 3의 배수인 성질이 있고 10의 배수인 수는 무조건 일의 자리가 0이어야 한다.
- 큰 수를 만들어야 하기 때문에 각 자릿수는 내림차순이어야 한다.
입력
N을 입력받는다. N는 최대 105개의 숫자로 구성되어 있으며, 0으로 시작하지 않는다.
출력
미르코가 만들고 싶어하는 수가 존재한다면 그 수를 출력하라. 그 수가 존재하지 않는다면, -1을 출력하라.
입력과 출력 예시
입력 | 출력 |
30 | 30 |
102 | 210 |
2931 | -1 |
80875542 | 88755420 |
내 소스
n = list(input())
n = list(map(int, n))
if (0 in n) and (sum(n) % 3 == 0):
n.sort(reverse=True)
result = ''.join(map(str, n))
else:
result = -1
print(result)
소스 설명
n = list(input())
n = list(map(int, n))
[1 - 2] : 입력 받은 숫자를 한 글자씩 쪼개서 리스트에 저장한다.
if (0 in n) and (sum(n) % 3 == 0):
n.sort(reverse=True)
result = ''.join(map(str, n))
else:
result = -1
[4 - 8] : 리스트 안에 0이 있으면서 리스트의 합(= 각 자릿수의 합)이 3의 배수이면 리스트를 내림차순으로 정렬하고 숫자로 만들어준다. 리스트 안에 0이 없거나 리스트의 합이 3의 배수가 아니라면 -1을 출력한다.
다른 코드 분석
푸는 방식의 차이는 있지만 기본 아이디어는 같게 푼 것 같다.
회고
- 어릴 적, 문제집의 날개에서 n의 배수 판정방법을 본 적이 있었다. 유일하게 기억했던 게 3의 배수였는데 관련 문제를 이렇게 접하게 될 줄 몰랐다. 어떤 블로그[3]를 통해서 위키백과에 '배수 판정법'이 있다는 것을 알게 되었다.
- 문제를 풀 때 split()을 이용해서 string을 한글자씩 쪼개려고 애를 썼다. 하지만 이럴 때는 split()을 사용할 게 아니라 string을 list로 변환해야 한다는 것을 알았다.
n = list(input())
print(n)
# 입력값 : hello
# 출력값 : ['h', 'e', 'l', 'l', 'o']
- join을 사용할 때는 무조건 문자열이어야 한다. 그렇기 때문에 int형 리스트를 join하기 위해서는 map을 사용하여 string으로 형변환을 해줘야 한다.
n = [3, 2, 1]
print(''.join(map(str, n)))
# 출력값 : 321
Ref.
2. 문제 풀이 / https://pacific-ocean.tistory.com/340
3. 문제 풀이 / https://puleugo.tistory.com/31
4. 배수 판정법(위키백과) / https://ko.wikipedia.org/wiki/%EB%B0%B0%EC%88%98_%ED%8C%90%EC%A0%95%EB%B2%95
5. int형 리스트 join 관련 / https://hyesun03.github.io/2017/04/08/python_int_join/
* 잘못된 부분에 대해 댓글 남겨주시면 감사하겠습니다! 😀
'코딩테스트' 카테고리의 다른 글
[코테/백준] Python 수 묶기 - 1744번 (0) | 2023.01.27 |
---|---|
[코테/백준] 레벨 기록 (0) | 2023.01.27 |
[코테/백준] Python ATM - 11399번 (0) | 2023.01.12 |
[코테/백준] Python 설탕 배달 - 2839번 (0) | 2023.01.12 |
[코테/CodeUp] Python 기초 100제 - 6098번 (0) | 2023.01.10 |