LoginSignup
iroirohasu
@iroirohasu (iro hasu)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

python 連続した数のカウント方法

Q&AClosed

https://atcoder.jp/contests/abc283/tasks/abc283_c
現在pythonでこの問題に取り組んでおり、入力された数で00が出現した回数をカウントしたいと考えているのですが調べてみてもわかっていない状態です。わかる方がいましたらぜひ教えていただきたいです。

例 1002002
  00の出現回数は2

'''''
問題文
高橋君は、レジ打ちの仕事をしています。

レジの機械には 00, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 の
11 個のボタンがあります。 レジの機械には、はじめ
0 が表示されています。 ボタン 00 を押すと、表示されている数が
100 倍されます。 それ以外のボタンを押すと、表示されている数が
10 倍されたあとに、押されたボタンに書かれている数が加算されます。

高橋君は、レジに整数
S を表示させたいです。 レジに
S が表示されている状態にするためには、少なくとも何回ボタンを押す必要があるか求めてください。

制約
1≤S≤10
100000

S は整数
'''''

0

5Answer

s = input()
cnt00 = 0
i = 0
while i + 1 < len(s):
    if s[i] == "0" and s[i+1] == "0":
        cnt00 += 1
        i += 1
    i += 1

print(len(s) - cnt00)


こんなのはいかがでしょうか?

1Like
def min_keypresses(S):
    num_presses = 0

    while S > 0:
        if S % 100 == 0:
            S //= 100
        else:
            S //= 10
            
        num_presses += 1

    return num_presses

print(min_keypresses(40004)) # 4
print(min_keypresses(1355506027)) # 10
print(min_keypresses(10888869450418352160768000001)) # 27

説明:
whileループを使って、
整数Sを表示するのに必要な最小のボタンを押す回数を計算する関数です。

  • Sが100に対して0の余りになる場合は、Sを100で割ることができます。
  • そうでない場合は、Sは10で割ることしかできません。

それぞれボタンの押された回数がnum_pressesでカウントされます。

1Like

正規表現を使って入力データを分解するアプローチもあります。

import re

#S = input()
S = '1002002'
res = re.findall(r'00|\d', S)
print(res)  # ['1', '00', '2', '00', '2']
print(len(res))  # 5

入力されたデータSを左から順に見ていき

  • 00があれば優先的に1つの塊として取りだす
  • それ以外の場合は1桁の数字を塊として取りだす
    という意味になります。

例の'1002002'という入力は ['1', '00', '2', '00', '2'] という塊のリストに分解されるので、要素の個数5が求める答えになります。

1Like

元の文字列の長さと、00を除いた文字列の長さから、00 の個数を求めてみました。

s = "1002002"
# len = 7
s_len = len(s)

ss = s.replace('00', '')
# len = 3
ss_len = len(ss)

#  (7 - 3) / 2 = 2 
ans = (int(s_len) - int(ss_len)) // 2
print(ans)
1Like

4人もの方に回答をいただけるとは。。。
ありがとうございます!!参考にさせていただきます!!

1Like

Your answer might help someone💌