白駿10610号:30



問題の説明

  • 与えられた数字を最大30倍に並べ替える問題.
  • 方法

  • 30の倍数は、最後の数を除いた数が3の倍数係数である.
  • 30の倍数=[3の倍数係数]x 10
  • 각 자릿수의 합이 3의 배수合計は3の倍数とする.
  • 4桁のabcdがあると仮定する.
  • 1000 a+100 b+10 c+dと表すことができる.
  • = (999a+a)+(99b+b)+(9c+c)+d
  • 全ての10^nは999…9+1で表すことができます.
  • = (999a+99b+9c)+(a+b+c+d)
  • = 3(333a+33b+3c)+(a+b+c+d)
  • 1桁当たりの和が3の倍数(a+b+c+d)=3 kの場合
  • 4桁abcd=3(333 a+33 b+c+k)=3の倍数.
  • 각 자릿수의 합으로3の倍数が確定しているので、どうしても桁数を置くと3の倍数になります.
  • a+b+c+dが3の倍数であればabcd、cabd、dabc、...など、すべての組み合わせが3の倍数です.
  • 3の倍数であるか否かが判定された場合、내림차순ソートにより最大の3倍数を作成することができる.

    正解

    n = input() # 문자열로 받습니다
    sum_ = 0
    for i in n:
        sum_+=int(i)
        
    if sum_%3 == 0 and '0' in n:    
        char_answer = ''.join(sorted(n)[::-1])
        print(int(char_answer))
    else:
        print(-1)
    

    その他

  • sum_%3 == 0大臣eval('+'.join(n))%3羅3の倍数で排水を行ったか判断し、結果として再発ミスがあった.ローカルでテストケーステストを行うときは正常に動作し、よくわかりませんが、エラーのためfor文を使用するコードに変更されました.
  • 3の倍数判別法の原理と同様に、9の倍数を求めることもできる.
  • 全桁の和が9の倍数であれば、総数は9の倍数となる.