🐼

AtCoder Beginner Contest 360[A - A Healthy Breakfast]

2024/07/01に公開

はじめに

言語はPython
次この問題と出会ったらどう解くか、私が100%扱える解法の作成を目的としている。

問題文

A - A Healthy Breakfast

高橋くんは、朝食にご飯、味噌汁、サラダを1皿ずつ食べます。
高橋くんの家のテーブルは細長いので、3皿を横一列に並べました。並べ方は文字列Sによって与えられ、左からi番目の皿はSi\textcolor{red}{R}ならご飯、Si\textcolor{red}{M}なら味噌汁、Si\textcolor{red}{S}ならサラダです。
ご飯の皿が味噌汁の皿より左にあるかどうかを判定してください。

制約

  • ∣S∣=3
  • Sには\textcolor{red}{RMS}が1文字ずつ含まれる

入力

入力は以下の形式で標準入力から与えられる。

S

出力

ご飯の皿が味噌汁の皿より左にあれば Yes 、そうでなければ No を出力してください。

考え方

  • 全パターンを書き出してif文で解く

    • \textcolor{red}{RSM}, \textcolor{red}{RMS}, \textcolor{red}{SRM}の時にYes、それ以外がNo
      coolな解き方じゃないため却下
  • 前から見ていき、\textcolor{red}{R}と先に出会ったらYes、\textcolor{red}{M}と先に出会ったらNo
    セクシーだし、初歩的なテクニックのみで解けるため採用

  • \textcolor{red}{R}のあるインデックスを探す。\textcolor{red}{M}のあるインデックスを探す。数値を比較して\textcolor{red}{R}<\textcolor{red}{M}を満たすようにする(ループかfind等)
    後学のため取り扱う

  • \textcolor{red}{S}を削除し、残った文字列が\textcolor{red}{RM}ならYes、\textcolor{red}{MR}ならNo
    後学のため取り扱う

解法

S = input()
for i in range(len(S)):
    if S[i]=="R":
        print("Yes")
        break
    if S[i]=="M":
        print("No")
        break
  1. 文字列の各文字を順にチェック
for i in range(len(S)):
  • len(S)は文字列Sの長さを表している
    この場合だとlen(S)3である
  • range(len(S))0からlen(S)-1までの範囲
  • つまりこの一文はi012と順番にループを行う
  1. 特定の文字を見つけた時の処理
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

\textcolor{red}{R}のあるインデックスを探す。\textcolor{red}{M}のあるインデックスを探す。数値を比較して\textcolor{red}{R}<\textcolor{red}{M}を満たすようにする(ループ) のパターン

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")
  1. 文字列のi番目が\textcolor{red}{R}だった場合、変数ri(何番目だったか)を代入
if S[i]=="R":
    r = i
  1. 文字列のi番目が\textcolor{red}{M}だった場合、変数mi(何番目だったか)を代入
if S[i]=="M":
        m = i
  1. rmを大小比較
    rの方が小さい = \textcolor{red}{R}の方が左にある
if r<m:
    print("Yes")
else:
    print("No")

別解1-2

\textcolor{red}{R}のあるインデックスを探す。\textcolor{red}{M}のあるインデックスを探す。数値を比較して\textcolor{red}{R}<\textcolor{red}{M}を満たすようにする(find) のパターン

S = input()
if S.find("R") < S.find("M"):
    print("Yes")
else:
    print("No")
  1. S.find("R")で文字列Sの中で最初に\textcolor{red}{R}が出現する位置を取得
  2. \textcolor{red}{R}\textcolor{red}{M}の位置を大小比較

別解2

\textcolor{red}{S}を削除し、残った文字列が\textcolor{red}{RM}ならYes、\textcolor{red}{MR}ならNo のパターン

S = input()
new_S = S.replace("S", "")
if new_S.find("R") < new_S.find("M"):
    print("Yes")
else:
    print("No")
  1. 元の文字列から\textcolor{red}{S}を削除する
new_S = S.replace("S", "")
  • S.replace("S","")は文字列Sの中の\textcolor{red}{S}という文字をすべて削除(空文字に変換)する
  • その結果をnew_Sに代入する
  1. 残った文字列で\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}ならNoとしてもok

おわりに

print("YNeos"[input()in"SMRS MSR"::2])

一文で片付ける方法もある。今の私にはまだ早い。

Discussion