CODE FESTIVAL 2016 qual A C – 次のアルファベット をPython3で解く

Share

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

出典:
CODE FESTIVAL 2016 qual A C – 次のアルファベット

それほど難しくはない。最後の文字を変換するときは、剰余を利用しよう。

# CODE FESTIVAL 2016 qual A C - 次のアルファベット
# https://atcoder.jp/contests/code-festival-2016-quala/tasks/codefestival_2016_qualA_c
# tag: 文字列 変換 辞書順 高橋君

# 各文字を変換する際には、
# 1) a に変換可能なら、変換する
# 2) a に変換できないなら、変換しないほうがいい
# ということを踏まえて組んでいく

def main():
    s = input()
    K = int(input())

    # とりあえず 0 ~ 25 と A ~ Z を相互変換しやすくしておく
    # ord と chr を使ってもいいけど、好みで……
    alphabets = 'abcdefghijklmnopqrstuvwxyz'
    num_to_ab = {k:v for k, v in zip(range(26), alphabets)}
    ab_to_num = {k:v for v, k in num_to_ab.items()}

    rest = K

    # 数字に変換しておく
    ch_list = [ab_to_num[c] for c in s]

    # 文字を順番に見ていき、'a' に変換可能なら変換する
    for i, n in enumerate(ch_list):
        # 文字列の最後なら、余っている操作回数を全て使用する
        if i == len(ch_list) - 1:
            ch_list[i] = (ch_list[i] + rest) % 26
            break

        # 元々 'a' なら変換しない
        if n == 0:
            continue

        # 'a' に変換可能な操作回数が残っていれば、変換する
        if n + rest > 25:
            rest -= 26 - n
            ch_list[i] = 0

    print(''.join(num_to_ab[n] for n in ch_list))

main()
Share

コメントを残す

メールアドレスが公開されることはありません。