Loading [MathJax]/extensions/tex2jax.js

dwangoプログラミングコンテスト B – ニコニコ文字列 をPython3で解く

Share

AtCoder上にある問題のうち、AtCoder Problemsでdiff 800以上と判定されているものを順番に解いていく企画。
基本的な考え方は全てコード中のコメントに入れてあるので、参照のこと。

出典:
dwangoプログラミングコンテスト B – ニコニコ文字列

真面目に実装していくと、意外と面倒くさい問題。

# dwangoプログラミングコンテスト B - ニコニコ文字列
# https://atcoder.jp/contests/dwango2015-prelims/tasks/dwango2015_prelims_2
# tag: 文字列 正規表現 繰り返し 連続部分列 数え上げ 考察

# "252525..." と N 回 "25" が繰り返されている文字列から、
# 何回部分文字列が取り出せるかを考えてみる。
# "25" は N 回取り出せ、"2525" は N-1 回取り出せ……と
# 順に考えていくと、1 ~ N までの合計回数取り出せることになる。

# あとは、"2525..." をどうやって抽出するのか、という話。

def main():
    S = input()+'0'

    # 2525の連続回数を保存しておくリスト
    seq = []

    # 2525を蓄えるバッファ
    buffer = ''

    for c in S:
        # バッファに文字を加える場合
        if c == '2' and not buffer.endswith('2'):
            buffer += '2'
        elif c == '5' and buffer.endswith('2'):
            buffer += '5'

        # バッファをクリアし、2525の数をseqに加える場合
        else:
            if len(buffer) >= 2:
                seq.append(len(buffer)//2)
            # この処理を忘れがち(個人的戒め)
            if c == '2':
                buffer = '2'
            else:
                buffer = ''

    # 後は連続回数に応じて計算する
    result = 0
    for n in seq:
        result += (n + 1) * n // 2
    
    print(result)

main()

もう少し楽をしたい場合、文字列置換や正規表現を利用して、いろいろとやり方がある。いろいろとやってみたが、実はPython3においては、string.replace()後、split()を利用する方法が、楽な割に最速に近かった。

Share

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です