見出し画像

ほぼ日刊競プロ ABC182 C - To 3 ちょっと深掘り

C - To 3

問題文
各桁に 0 が出現しないような正の整数 N が与えられます。
N の桁数を k とします。N の桁を 0 個以上 k 個未満消して、残った桁をそのままの順序で結合することで 3 の倍数を作りたいです。
3 の倍数を作ることができるか判定し、作ることができるなら作るのに必要な最少の消す桁数を求めてください。

考えたこと

深く考えずにitertoolsを使った組み合わせで解を求めた.

import itertools
N = input()
length = len(N)
i = 0
for i in range(length):
 for v in itertools.combinations(N,length-i):
   temp = int("".join(v))
   if temp%3==0:
     print (i)
     quit()
print (-1)


一応ACなのではあるのだが


しかし,解説を見ても理解できない.

自分なりに整理してみた.

1.各桁を割った余りの和は元々の数の余りに等しい
2.余りが0,1,2の場合に分ける.
3.余りが0の時はそのままでOK
4.余りが1の時は元の桁の数が1個なら不可能,2個なら2個
5.余りが2の時も上記と同じ


N = input()
temp = [int(i)%3 for i in N]
#print (temp)
intN = int(N)
if intN%3==0:
   print (0)
elif intN%3==1:
   #print (temp)
   if 1 in temp:
       if len(N)<=1:
           print (-1)
       elif len(N)>=2:
           print (1)
   else:
       if len(N)<=2:
           print (-1)
       elif len(N)>=3:
           print (2)
elif intN%3==2:
   if 2 in temp:
       if len(N)<=1:
           print (-1)
       else:
           print (1)
   else:
       if len(N)<=2:
           print (-1)
       else:
           print (2)



この記事が気に入ったらサポートをしてみませんか?