본문 바로가기
🔅코딩테스트 공부🔅/❗백준

[백준] 10610번 30(with python)

by 윤무무 2023. 1. 27.

https://www.acmicpc.net/problem/10610

 

10610번: 30

어느 날, 미르코는 우연히 길거리에서 양수 N을 보았다. 미르코는 30이란 수를 존경하기 때문에, 그는 길거리에서 찾은 수에 포함된 숫자들을 섞어 30의 배수가 되는 가장 큰 수를 만들고 싶어한

www.acmicpc.net

 

1. 내가 작성한 코드
from itertools import permutations
import sys

n = sys.stdin.readline() #처음에 주어지는 수
arr = []

for j in permutations(n,len(n)): #순열로 모든 수 append
  j = list(j) #순열은 튜플 형식이기 때문에 list로 바꿔주기
  k = 1 
  while k>0:
    result = 0
    for i in range(len(j)): #리스트 안에 있는 str를 int로 바꿔줌
      if j[i] == 0:
        k -= 1
        pass
      else:
        b = len(j) - (i+1)
        result += (int(j[i]) * (10**b))
        k-=1
    if result % 30 == 0:
      arr.append(result)

if len(arr) == 0:
  print(-1)  

print(max(arr))

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 당연하게 시간초과로 실패ㅠㅠ

 

심지어 나는 join 이란 함수를 몰랐기 때문에 다른 분들보다 코드가 더~~~ 길다.

 

2. 수정 코드
N = input()
if '0' not in N:
  print(-1)

else:
  sum_digit = 0
  for i in N:
    sum_digit += int(i)
  
  if sum_digit % 3 != 0:
    print(-1)
  
  else:
    for i in sorted(N, reverse=True):
      print(i, end='')

 

30의 배수가 되는 조건을 충족시키는 코드를 작성하면 된다.

 

1. 10의 배수 => 첫 if문에서 0이 없으면 오류 발생

2. 모든 숫자의 합이 3 => sum_digit 변수에 모든 숫자의 합을 더해주고, 3으로 나눈 나머지가 0이 아니라면 오류 발생

 

이걸 어케 생각하지? 하고 구글링을 해봤는데,, 배수 판별법이 있네

 

3. 배수 판별법
  • 2의 배수 : 끝자리가 0,4,6,8이면 원래 수는 2의 배수
  • 3의 배수 : 각 자리 수의 합이 3의 배수이면 원래 수도 3의 배수
  • 4의 배수 : 끝 두자리 수가 4의 배수
  • 5의 배수 : 끝자리가 0 또는 5
  • 6의 배수 : 2의 배수이면서 동시에 3의 배수인 경우
  • 8의 배수 : 끝 세 자리 수가 8의 배수
  • 9의 배수 : 각 자리 수의 합이 9의 배수

이러한 배수 판별법 + 10의 배수 라는 조건을 더해서 풀어주면 된다.

 

4. join()

'구분자'.join(리스트) 를 이용하면 리스트 값과 값 사이에 '구분자'에 들어온 구분자를 넣어서 하나의 문자열로 합쳐줌

 

당연히 ''.join(리스트) 처럼 구분자를 넣지 않으면, 요소 하나하나를 문자열로 바꾸어 반환

 

 

댓글