ABC049 C - 白昼夢

備忘録

問題

atcoder.jp

回答

import sys
import os
import math
import bisect
import collections
import itertools
import heapq
import re

ii = lambda: int(sys.stdin.buffer.readline().rstrip())
il = lambda: list(map(int, sys.stdin.buffer.readline().split()))
fl = lambda: list(map(float, sys.stdin.buffer.readline().split()))
iln = lambda n: [int(sys.stdin.buffer.readline().rstrip()) for _ in range(n)]

iss = lambda: sys.stdin.buffer.readline().decode().rstrip()
sl = lambda: list(map(str, sys.stdin.buffer.readline().decode().split()))
isn = lambda n: [sys.stdin.buffer.readline().decode().rstrip() for _ in range(n)]

lcm = lambda x, y: x * y / math.gcd(x, y)

MOD = 10 ** 9 + 7
MAX = float('inf')


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

    S = iss()
    print('YES' if re.match('^(dream|dreamer|erase|eraser)+$', S) else 'NO')


if __name__ == '__main__':
    main()

考え方

正規表現を使用して回答を行った。
参考:書きながら覚える!Pythonで正規表現を使う方法【初心者向け】 | TechAcademyマガジン

問題はdream, dreamer, erase, eraserを好きな回数使用し、
英小文字Sと同一の文字を作れるか否かを問われている。
そのため、以下の条件を満たす正規表現から、
一致する文字列が存在するか否かで回答を得ることが出来る。

  • 英小文字Sは全てdream, dreamer, erase, eraserで構成されていること
    • 構成する文字(dream|dreamer|erase|eraser) 、1回以上の繰り返し+
  • 英小文字Sの先頭はdream, dreamer, erase, eraserいずれかで始まっていること
    • 行の先頭^
  • 英小文字Sの末尾はdream, dreamer, erase, eraserいずれかで終わっていること
    • 行の末尾$