본문 바로가기

개발공부/문제풀이

백준 10610 : 30 파이썬 풀이(python)

728x90
반응형

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)
  1. n을 입력받고 sorted 함수로 리스트를 만들어 내림차순 정렬 시킨다.
  2. 입력받은 n에 0이 들어가지 않았다면 30의 배수가 될수 없으므로 첫번째로 걸러낸다.
  3. 0이 포함되어 있다면 입력받은 리스트n 을 <for문>을 돌려 전부 더했을때 3의 배수가 되어야 하므로 3으로 나눈 나머지가 0인것이 30의 배수이다!
728x90
반응형