AtCoder Beginner Contest 360[A - A Healthy Breakfast]
はじめに
言語はPython
次この問題と出会ったらどう解くか、私が100%扱える解法の作成を目的としている。
問題文
高橋くんは、朝食にご飯、味噌汁、サラダを1皿ずつ食べます。
高橋くんの家のテーブルは細長いので、3皿を横一列に並べました。並べ方は文字列によって与えられ、左から S 番目の皿は i が Si ならご飯、 \textcolor{red}{R} が Si なら味噌汁、 \textcolor{red}{M} が Si ならサラダです。 \textcolor{red}{S}
ご飯の皿が味噌汁の皿より左にあるかどうかを判定してください。制約
=3 ∣S∣ には S が1文字ずつ含まれる \textcolor{red}{RMS} 入力
入力は以下の形式で標準入力から与えられる。
S
出力
ご飯の皿が味噌汁の皿より左にあれば Yes 、そうでなければ No を出力してください。
考え方
-
全パターンを書き出してif文で解く
-
,\textcolor{red}{RSM} ,\textcolor{red}{RMS} の時にYes、それ以外がNo\textcolor{red}{SRM}
coolな解き方じゃないため却下
-
-
前から見ていき、
と先に出会ったらYes、\textcolor{red}{R} と先に出会ったらNo\textcolor{red}{M}
セクシーだし、初歩的なテクニックのみで解けるため採用 -
のあるインデックスを探す。\textcolor{red}{R} のあるインデックスを探す。数値を比較して\textcolor{red}{M} <\textcolor{red}{R} を満たすようにする(ループかfind等)\textcolor{red}{M}
後学のため取り扱う -
を削除し、残った文字列が\textcolor{red}{S} ならYes、\textcolor{red}{RM} ならNo\textcolor{red}{MR}
後学のため取り扱う
解法
S = input()
for i in range(len(S)):
if S[i]=="R":
print("Yes")
break
if S[i]=="M":
print("No")
break
- 文字列の各文字を順にチェック
for i in range(len(S)):
-
len(S)
は文字列 の長さを表しているS
この場合だとlen(S)
は である3 -
range(len(S))
は から0 len(S)-1
までの範囲 - つまりこの一文は
にi 、0 、1 と順番にループを行う2
- 特定の文字を見つけた時の処理
if S[i] == "R":
print("Yes")
break
if S[i] == "M":
print("No")
break
-
番目の文字がi かどうかチェック\textcolor{red}{R} - もし
だったら\textcolor{red}{R} と表示し、Yes break
でループを終了
- もし
-
番目の文字がi かどうかチェック\textcolor{red}{M} - もし
だったら\textcolor{red}{M} と表示し、No break
でループを終了
- もし
別解1-1
S = input()
for i in range(len(S)):
if S[i]=="R":
r = i
if S[i]=="M":
m = i
if r<m:
print("Yes")
else:
print("No")
- 文字列の
番目がi だった場合、変数\textcolor{red}{R} にr (何番目だったか)を代入i
if S[i]=="R":
r = i
- 文字列の
番目がi だった場合、変数\textcolor{red}{M} にm (何番目だったか)を代入i
if S[i]=="M":
m = i
-
とr を大小比較m
の方が小さい =r の方が左にある\textcolor{red}{R}
if r<m:
print("Yes")
else:
print("No")
別解1-2
S = input()
if S.find("R") < S.find("M"):
print("Yes")
else:
print("No")
-
S.find("R")
で文字列 の中で最初にS が出現する位置を取得\textcolor{red}{R} -
と\textcolor{red}{R} の位置を大小比較\textcolor{red}{M}
別解2
S = input()
new_S = S.replace("S", "")
if new_S.find("R") < new_S.find("M"):
print("Yes")
else:
print("No")
- 元の文字列から
を削除する\textcolor{red}{S}
new_S = S.replace("S", "")
-
S.replace("S","")
は文字列 の中のS という文字をすべて削除(空文字に変換)する\textcolor{red}{S} - その結果を
new_S
に代入する
- 残った文字列で
と\textcolor{red}{R} の位置を比較\textcolor{red}{M}
if new_S.find("R") < new_S.find("M"):
print("Yes")
else:
print("No")
- パターンが少ないため、文字列が
なら\textcolor{red}{RM} 、Yes なら\textcolor{red}{MR} としてもokNo
おわりに
print("YNeos"[input()in"SMRS MSR"::2])
一文で片付ける方法もある。今の私にはまだ早い。
Discussion