https://www.acmicpc.net/problem/10610
10610번: 30
어느 날, 미르코는 우연히 길거리에서 양수 N을 보았다. 미르코는 30이란 수를 존경하기 때문에, 그는 길거리에서 찾은 수에 포함된 숫자들을 섞어 30의 배수가 되는 가장 큰 수를 만들고 싶어한
www.acmicpc.net
문제
어느 날, 미르코는 우연히 길거리에서 양수 N을 보았다. 미르코는 30이란 수를 존경하기 때문에, 그는 길거리에서 찾은 수에 포함된 숫자들을 섞어 30의 배수가 되는 가장 큰 수를 만들고 싶어한다.
미르코를 도와 그가 만들고 싶어하는 수를 계산하는 프로그램을 작성하라.
입력
N을 입력받는다. N는 최대 105개의 숫자로 구성되어 있으며, 0으로 시작하지 않는다.
출력
미르코가 만들고 싶어하는 수가 존재한다면 그 수를 출력하라. 그 수가 존재하지 않는다면, -1을 출력하라.
예제 입력 1 복사
30
예제 출력 1 복사
30
예제 입력 2 복사
102
예제 출력 2 복사
210
예제 입력 3 복사
2931
예제 출력 3 복사
-1
예제 입력 4 복사
80875542
예제 출력 4 복사
88755420
먼저 알아야 할 요소를 정리해 보면
1. 배수의 법칙
- 2의 배수는 모두 짝수이다.
- 3의 배수는 각 자리의 숫자의 합이 3의 배수인 수이다.
- 4의 배수는 끝의 두자리 수가 00 또는 4의 배수인 수이다.
- 5의 배수는 일의 자리의 숫자가 0 또는 5인 수이다.
- 6의 배수는 3의 배수 중에서 짝수인 수이다.
- 7의 배수는 끝의 자리에서부터 세 자리씩 끊었을 때 홀수번째 부분의 합과 짝수번째 부분의 합의 차가 0 또는 7의 배수인 수이다.
이문제에서는 30의 배수를 구해야한다.
30의 배수가 되려면 끝자리는 0이 되어야하고 각 자리수를 합했을 때 3의 배수가 되어야한다.
2. sorted 함수
- sorted(정렬할 데이터)
- sorted(정렬할 데이터, reverse = True/False) 'True' 라면 내림차순 정렬, 'False'라면 오름차순 정렬을 한다.
- sorted(정렬할 데이터, key 파라미터)
- sorted(정렬할 데이터, key 파라미터, reverse = True/False)
매개변수로 들어올 "정렬할 데이터"는 iterable 한 데이터 여야 한다.
그말은 즉, str 타입만 가능한것! int 타입은 불가하다(TypeError: 'int' object is not iterable)
- key 옵션 (key 파라미터)
sorted 함수의 key 파라미터는 어떤 것을 기준으로 정렬할 것인가? 에 대한 기준입니다.
즉, key 값을 기준으로 비교를 하여 정렬을 하겠다는 것인데, 이것을 정해 줄 수 있는 파라미터입니다.
sorted( ~~ , key=뭐뭐)로 입력하게 되면 해당 키를 기준으로 정렬하여 반환합니다.
** 리스트.sort()와 sorted(리스트)의 가장 큰 차이는
리스트.sort() 는 본체의 리스트를 정렬해서 변환하는 것이고,
sorted(리스트) 는 본체 리스트는 내버려두고, 정렬한 새로운 리스트를 반환하는 것입니다.
출처: https://blockdmask.tistory.com/466 [개발자 지망생]
3. join 함수
'구분기호(문자)'.join(리스트)
join 함수는 매개변수로 들어온 리스트에 있는 요소 하나하나를 합쳐서 하나의 문자열로 바꾸어 반환하는 함수입니다.
- ''.join(리스트)
''.join(리스트)를 이용하면 매개변수로 들어온 ['a', 'b', 'c'] 이런 식의 리스트를 'abc'의 문자열로 합쳐서 반환해주는 함수인 것입니다.
- '구분자'.join(리스트)
'구분자'.join(리스트)를 이용하면 리스트의 값과 값 사이에 '구분자'에 들어온 구분자를 넣어서 하나의 문자열로 합쳐줍니다.
'_'.join(['a', 'b', 'c']) 라 하면 "a_b_c" 와 같은 형태로 문자열을 만들어서 반환해 줍니다.
예. 눈치 빠르신 분들은 눈치채셨겠지만
처음에 소개 해준 ''.join(리스트)는 '구분자'.join(리스트)에서 '구분자'가 그냥 공백인 것과 같습니다.
즉, 정리하자면 join함수의 찐 모양은 '구분자'.join(리스트) 입니다.
출처: https://blockdmask.tistory.com/468 [개발자 지망생]
나의 코드!
n = input()
n = sorted(n, reverse= True)
sum = 0
if '0' not in n:
print(-1)
else:
for i in n:
sum += int(i)
if sum%3 == 0 :
print(''.join(n))
else:
print(-1)
- n을 입력받고 sorted 함수로 리스트를 만들어 내림차순 정렬 시킨다.
- 입력받은 n에 0이 들어가지 않았다면 30의 배수가 될수 없으므로 첫번째로 걸러낸다.
- 0이 포함되어 있다면 입력받은 리스트n 을 <for문>을 돌려 전부 더했을때 3의 배수가 되어야 하므로 3으로 나눈 나머지가 0인것이 30의 배수이다!
'개발공부 > 문제풀이' 카테고리의 다른 글
백준 10819 : 차이를 최대로 파이썬(python) (0) | 2021.12.28 |
---|---|
백준 21756 : 지우개 파이썬(python) (0) | 2021.12.27 |
백준 9093:단어 뒤집기 python(파이썬) (0) | 2021.12.13 |
백준 1026 파이썬(python) pop과 remove (0) | 2021.12.11 |
백준 1546 평균 python 풀이 (0) | 2021.12.02 |