ABC146 B - ROT N

備忘録

問題

atcoder.jp

回答

import sys
import os


def main():
    if os.getenv("LOCAL"):
        sys.stdin = open("input.txt", "r")

    N = int(sys.stdin.buffer.readline())
    S = sys.stdin.buffer.readline().decode().rstrip()

    ret = []
    for s in S:
        n = ord(s) + N
        if n > 90:
            ret.append(chr(n - 26))
        else:
            ret.append(chr(n))

    print("".join(ret), end="")


if __name__ == '__main__':
    main()

考え方

英大文字をord文字コードに変えて、Nを加算。
文字コード90を超える(Z以降になる)場合は26を減算、
超えていない場合はそのままchrで英大文字に変換する。

注意しなければならないのは、sys.stdinで標準入力を受け取る際に、

    N = int(sys.stdin.readline().rstrip())
    S = sys.stdin.readline()

のようなやり方ではWAになる。

あと、もうちょっと綺麗な回答

Submission #10947423 - AtCoder Beginner Contest 146

(ord(s) + N - 65 ) % 26Z以降の英大文字になっている場合は、余りを利用することで、
A ~ Zを一周した後の文字コードの値にしている。