くろたんく雑記帳

日常とか、わんちゃんとか、機械学習とか、競プロとか、

MENU

Python3で解く AtCoder Beginner Contest 182 C - To 3

3の倍数になるかどうかなので、mod3で場合分け、そしてさらにその結果で場合分けっていうふうに愚直にやる。

目次

概要

問題

  1. 各桁に{\displaystyle 0}を含まない正の整数{\displaystyle N}が与えられる。
  2. {\displaystyle N}の桁数を{\displaystyle k}として{\displaystyle k}未満個ある桁を消すことができる。
  3. その結果左から順に結合した数値が3の倍数であるようにできる最小限の消す数は?

解くときに考えた内容

  • ポイントは、答えが0, 1, 2, -1しかないということ。なぜなら、
    • {\displaystyle N}が3で割り切れるか(0が答えのパターン)
    • わりきれない場合は、{\displaystyle N}のどこかの桁を消す。
      • {\displaystyle N \% 3 = 1}の時だと、{\displaystyle N}のある桁の値({\displaystyle n}とする)が{\displaystyle n \% 3 = 1}が1つか{\displaystyle n \% 3 = 2}が2つあれば、結果的に結合した値は3で割り切れる。
      • {\displaystyle N \% 3 = 2}の時だと、{\displaystyle N}のある桁の値({\displaystyle n}とする)が{\displaystyle n \% 3 = 2}が1つか{\displaystyle n \% 3 = 1}が2つあれば、結果的に結合した値は3で割り切れる。
    • この時点で、1か2が答えのパターン
    • ただし、桁が{\displaystyle 1 \leq k \leq 2}の時は消せる数が自身の桁数未満であることに注意する。
      • 例えば1とか11は-1が答え
    • {\displaystyle n \% 3 = 1}{\displaystyle n \% 3 = 2}の数をそれぞれカウントして、1つでいいパターンがあれば1が答え、2つでいいパターンがあれば2が答え。(ここで、なりで数えた順とかでやるとミスる。最後まで数えて、あるなしを判定する。
    • あとは1-2桁対策用の処理

コード

N = list(input())
N = [int(x) for x in N]
k = len(N)
sum_n = sum([int(x) for x in N])
mod = sum_n % 3
# Nが3で割り切れる場合
if mod == 0:
    print(0)
    exit()
# Nが3で割ると1余る場合
elif mod == 1:
    cnt_1 = 0
    cnt_2 = 0
    for n in N:
        # 各桁に3で割って余り1になる桁があるかカウント
        if n % 3 == 1:
            cnt_1 += 1
        # 各桁に3で割って余り2になる桁があるかカウント
        elif n % 3 == 2:
            cnt_2 += 1
    # 一つでもあればいい方を優先
    if cnt_1 >= 1 and 1 < k:
        print(1)
        exit()
    elif cnt_2 >= 2 and 2 < k:
        print(2)
        exit()
    else:
        print(-1)
        exit()
elif mod == 2:
    cnt_1 = 0
    cnt_2 = 0
    for n in N:
        # 各桁に3で割って余り2になる桁があるかカウント
        if n % 3 == 2:
            cnt_1 += 1
        # 各桁に3で割って余り1になる桁があるかカウント
        elif n % 3 == 1:
            cnt_2 += 1
    # 一つでもあればいい方を優先
    if cnt_1 >= 1 and 1 < k:
        print(1)
        exit()
    elif cnt_2 >= 2 and 2 < k:
        print(2)
        exit()
    else:
        print(-1)
        exit()

参考になる書籍

けんちょんさんこと、大槻さんの書籍である、「問題解決力を鍛える!アルゴリズムとデータ構造」 ご本人の記事の中で難易度は、螺旋本ということで初学者でも非常に結構読みやすい!!!(実際に、けんちょんさんの記事はC++に疎い自分でも、その思考プロセスを学べるくらい丁寧に書かれているし、この書籍も非常に読みやすい)どのようなステータスの人にもおすすめの一冊になっている。

とうとう発売され自分の手元にも来た(2020-10-03)。現在読み中なのである程度読み込んだら感想を書く予定。めっちゃ図が多いし、章末問題もあるしかなりイケてる。答えはC++で書かれているがそのうちPythonでも書かれるとのことなので、自分で前もってやってしまおうと思う(答え合わせできるのはありがたい)。

問題解決力を鍛える!アルゴリズムとデータ構造 (KS情報科学専門書)

問題解決力を鍛える!アルゴリズムとデータ構造 (KS情報科学専門書)

  • 作者:大槻 兼資
  • 発売日: 2020/10/02
  • メディア: 単行本(ソフトカバー)

章末問題を解いてる。まだ途中。 blacktanktop.hatenablog.com