問題
要約
- カードには小文字アルファベット(a-z)または@が書かれている
- カードは2列に並べられる
- カードを同じ枚数ずつ2列に並べて、2つの文字列を作る
- @のカードは'a', 't', 'c', 'o', 'd', 'e', 'r'のいずれかに置き換える
- 2つの列が同じ文字列になれば勝ち、異なれば負け
与えられた2つの文字列に対して、@を適切に置き換えることで同じ文字列にできるかどうかを判定する
既存投稿一覧ページへのリンク
独り言
AtCoder初期だからかもしれないけど、要件がメモリ64M以下なのね。
メモリエラーは久しぶりに見た。。。
アプローチ
2つの文字列を同時に比較しながら、各位置の文字が条件を満たすかどうかを確認する。
文字列全体を走査し終えるまでに条件を満たさない箇所がなければ勝利可能と判断し、そうでなければ敗北と判断する。
解法手順
- 2つの文字列S, Tを入力として受け取る。
- "atcoder"の文字をセットとして保持する。
- 文字列Sの長さ分だけ繰り返し処理を行う。
- 各位置iにおいて、以下の条件をチェックする:
- S[i]とT[i]が両方とも"@"でなく、かつ異なる場合は即座に敗北と判定する。
- S[i]とT[i]のどちらか一方が"@"の場合:
- "@"でない方の文字が"atcoder"のいずれでもない場合は即座に敗北と判定する。
- すべての位置でチェックを通過した場合、勝利可能と判定する。
MLEコード
MLE.py
def io_func():
# 2つの文字列S, Tを入力として受け取る
S = input()
T = input()
return S, T
def solve(S, T):
# "atcoder"の文字をセットとして保持する
atcoder = set(list("atcoder"))
# 文字列Sの長さ分だけ繰り返し処理を行う
for i in range(len(S)):
# S[i]とT[i]が両方とも"@"でなく、かつ異なる場合は即座に敗北と判定する
if "@" not in [S[i], T[i]] and S[i] != T[i]:
print("You will lose")
return
# S[i]とT[i]のどちらか一方が"@"の場合
if [S[i], T[i]].count("@") == 1:
# S[i]が"@"でなく、かつ"atcoder"のいずれでもない場合は即座に敗北と判定する
if S[i] != "@" and S[i] not in atcoder:
print("You will lose")
return
# T[i]が"@"でなく、かつ"atcoder"のいずれでもない場合は即座に敗北と判定する
if T[i] != "@" and T[i] not in atcoder:
print("You will lose")
return
# すべての位置でチェックを通過した場合、勝利可能と判定する
print("You can win")
# メイン処理
S, T = io_func()
solve(S, T)
# ###
# 変数の意味:
# S: 1つ目の入力文字列
# T: 2つ目の入力文字列
# atcoder: "atcoder"の文字をセットとして保持する変数
#
# 1. io_func関数で標準入力から2つの文字列S, Tを受け取る。
# 2. solve関数で主な処理を行う。
# a. "atcoder"の文字をセットとして保持する。
# b. 文字列Sの長さ分だけ繰り返し処理を行う。
# c. 各位置iにおいて、S[i]とT[i]を比較し、条件をチェックする。
# d. 条件を満たさない場合は即座に"You will lose"を出力して関数を終了する。
# e. すべての位置でチェックを通過した場合、"You can win"を出力する。
# 3. メイン処理でio_func関数とsolve関数を呼び出し、結果を得る。