長期投資シミュレーションツール『Tousimu』をリリースしました!

【解答付き】paizaスキルチェック見本問題「みんなでしりとり!(Bランク)」を解説!

プログラミング
スポンサーリンク

この記事では

プログラミング学習サービスpaizaラーニング

スキルチェックレベルアップ問題集をわかりやすく解説します!

プログラミング言語はpythonです。

今回はBランク相当の以下の問題を解説します。

他のレベルアップ問題集のの解答と解説もしているので

ぜひご参考ください!

またpaizaの各ランクの攻略法は

こちらで詳しく紹介しているので、ぜひご参考ください!

スポンサーリンク

この問題を解くための3つのポイント

まずは「この問題を解くためのポイント」をご説明します。

問題はこちらからご確認ください。

みんなでしりとり! (paizaランク B 相当)

この問題を解くためのポイントは3つです。

この問題を解くためのポイント
  • 頭文字とは無関係のルールを判定
  • 頭文字が直前の最後の文字と等しいルールを判定
  • 何番目の人が抜けたか特定

頭文字とは無関係のルールを判定

まずは「発言の頭文字とは無関係のルールを判定」です。

今回の問題では、以下の4つのルールがしりとりに課されています。

しりとりのルール
  1. 単語リストの中から発言しなければならない
  2. 頭文字は直前の最後の文字と同じ(最初の人は除く)
  3. 同じ単語は2回使えない
  4. zで終わってはいけない

最初に1, 3, 4のルールの処理を考えます。

まず1のルールは、入力から単語のリストを作成し

if文で入力された発言が単語リストに存在するか判定します。

# 発言された単語
said = input()

""" wordsは単語リスト """
# 単語リストに存在しない場合
if not said in words:

if文については、こちらをご参考ください!

次に3のルールは一度発言した単語を格納する使用済みリストを作成し

if文を使って入力された発言が、使用済みリストに存在するか判定します。

# 発言された単語
said = input()

""" wordsは単語リスト """
# 単語リストに存在しない場合
if not said in words:

""" usedは使用済みリスト """
# 使用済みリストに存在する場合
elif said in used:

リストについては、こちらをご参考ください!

最後に4のルールは

文字列のスライスを使って最後の文字を抜き出し

if文を使って"z"と同じか判定します。

# 発言された単語
said = input()

""" wordsは単語リスト """
# 単語リストに存在しない場合
if not said in words:

""" usedは使用済みリスト """
# 使用済みリストに存在する場合
elif said in used:

# 最後の文字が'z'の場合
elif said[-1] == 'z'

そしてそれぞれの場合に

しりとりに参加している人数を1人減らします。

# 発言された単語
said = input()

""" wordsは単語リスト、numは参加人数 """
# 単語リストに存在しない場合
if not said in words:
    # 人数を1人減らす
    N -= 1

""" usedは使用済みリスト """
# 使用済みリストに存在する場合
elif said in used:
    # 人数を1人減らす
    N -= 1

# 最後の文字が'z'の場合
elif said[-1] == 'z'
    # 人数を1人減らす
    N -= 1

引き算などの四則演算についてはこちらをご参考ください!

またor演算子を使ってif文を1行にまとめると、よりシンプルです!

# 発言された単語
said = input()

""" wordsは単語リスト、numは参加人数、usedは使用済みリスト """
# 単語リストに存在しない、使用済みリストに存在する、最後の文字が'z'場合
if not said in words or said in used or said[-1] == 'z':
    # 人数を1人減らす
    N-= 1

頭文字が直前の最後の文字と等しいルールを判定

次は「頭文字が直前の最後の文字と等しいルールを判定」です。

次は2のルールの処理を考えていきます。

しりとりのルール
  1. 単語リストの中から発言しなければならない
  2. 頭文字は直前の最後の文字と同じ(最初の人は除く)
  3. 同じ単語は2回使えない
  4. zで終わってはいけない

まずは最初の人かどうかは問わず

頭文字が直前の最後の文字と同じかをif文を使って判定します。

直前の最後の文字は使用済みリストをスライスして末尾の単語を抜き出します。

# 発言された単語
said = input()

""" usedは使用済みリスト """
# 頭文字が直前の最後の文字と違う場合
if not used[-1][-1] == said[0]:
    # 人数を1人減らす
    N -= 1

またしりとりが続く場合には

発言した単語を使用済みリストにappendメソッドで追加します。

# 発言された単語
said = input()

""" usedは使用済みリスト """
# 頭文字が直前の最後の文字と違う場合
if not used[-1][-1] == said[0]:
    # 人数を1人減らす
    N -= 1

# 頭文字が直前の最後の文字と同じ場合
else:
    # 使用済みリストに単語を追加
    used.append(said)

リストについてはこちらをご参考ください!

次に最初の人かどうかを考えます。

今回は最初の人かどうか判定するために

bool型の変数を用意し、if文で条件分岐を行います。

# 最初の人かを判定する変数
init = True

# 発言された単語
said = input()

# 最初の人ではない場合
if not init:
    """ usedは使用済みリスト """
    # 頭文字が直前の最後の文字と違う場合
    if not used[-1][-1] == said[0]:
        # 人数を1人減らす
        N -= 1
    # 頭文字が直前の最後の文字と同じ場合
    else:
        # 使用済みリストに単語を追加
        used.append(said)
# 最初の人の場合
else:
    # 使用済みリストに単語を追加
    used.append(said)

if文については、こちらをご参考ください!

そしてしりとりのルールを守った場合にはbool型にFalseを代入し

破った場合にはTrueを代入します。

# 最初の人かを判定する変数
init = True

# 発言された単語
said = input()

# 最初の人ではない場合
if not init:
    """ usedは使用済みリスト """
    # 頭文字が直前の最後の文字と違う場合
    if not used[-1][-1] == said[0]:
        # 人数を1人減らす
        N -= 1
        # しりとりが最初からになる
        init = True
    # 頭文字が直前の最後の文字と同じ場合
    else:
        # しりとりが続く
        init = True
        # 使用済みリストに単語を追加
        used.append(said)

# 最初の人の場合
else:
    # しりとりが続く
    init = True
    # 使用済みリストに単語を追加
    used.append(said)

もちろん1,3,4のルールを破った場合にもTrueを代入します。

# 発言された単語
said = input()

""" wordsは単語リスト、numは参加人数、usedは使用済みリスト """
# 単語リストに存在しない、使用済みリストに存在する、最後の文字が'z'場合
if not said in words or said in used or said[-1] == 'z':
    # 人数を1人減らす
    N -= 1
    # しりとりが続く
    init = True

何番目の人が抜けたかを特定

最後は「何番目の人が抜けたかを特定」です。

今回の問題では最終的な結果として

残っている人数と何番目の人が残っているかを出力しなければなりません。

そのためリストと変数を使って

何番目の人が抜けたかを特定する処理を追加します。

# 何番目の人が残っているかのリスト
member = list(range(N))
# 発言した人が何番目かの変数
index = 0

最初にルールを破った場合には

リストからその人をpopメソッドで抜きます。

# 何番目の人が残っているかのリスト
member = list(range(N))
# 発言した人が何番目かの変数
index = 0

# ルールを破った場合
member.pop(index)

リストについては、こちらをご参考ください!

さらにルールを破った場合には、

indexから1を引きます。

例えば2番目の人がルールを破った場合、その人は抜けるため

次の3番目予定だった人が2番目になるためです。

# 何番目の人が残っているかのリスト
member = list(range(N))
# 発言した人が何番目かの変数
index = 0

# ルールを破った場合
member.pop(index)
# 1を引く
index -= 1

そして各発言に対する処理が終わった後に

次の人に移るために、index1を足します。

# Mは発言の回数
for _ in range(M):
    
    # 各発言に対する処理
    
    # 次に人に移る
    index += 1

引き算などの四則演算については、こちらをご参考ください!

ただし残っている人数を超えた場合には

if文を使って最初の人に戻します。

# Mは発言の回数
for _ in range(M):
    
    # 各発言に対する処理
    
    # 次に人に移る
    index += 1
    # 残っている人数を超えたら最初に戻る
    if index >= N:
        index = 0
スポンサーリンク

みんなでしりとり!(paizaランク B 相当)の解答

ではここまで紹介したポイントを使って、問題を解いていきます。

入力を受け取り、リストや変数を準備

まずは「入力を受け取り、リストや変数を準備」です。

今回の問題では最初に

  • しりとりに参加する最初の人数
  • 単語リストの単語数
  • しりとりの発言数

が半角スペース区切りで1行で入力されます。

そのため内包表記split関数を使い3つの変数に代入し、

さらにint型にも変換します。

# N,K,Mがそれぞれ人数、単語数、発言数
N, K, M = [int(x) for x in input().split()]

内包表記については、こちらをご参考ください!

次に単語リストの単語が改行区切りで入力されるので

これも内包表記を使ってリストの要素として受け取ります。

""" Kは単語数 """
# 単語リスト
words = [input() for x in range(K)]

そして以降の処理のために

  • 使用済みリスト
  • 最初の人かを判定する変数
  • 残っている人が何番目かを知るためのリスト
  • 何番目の人の発言か知るための変数

の4つを定義します。

# 使用済みリスト
used = []
# 最初の人かを判定する変数
init = True

""" Mは参加する人数 """
# 何番目の人が残っているかのリスト
member = list(range(N))
# 発言した人が何番目かの変数
index = 0

各発言から残る人数とそれが何番目かを求める

次は「各発言から残る人数とそれが何番目かを求める」です。

まずは各発言の入力に対して処理を行うために

発言数に対してfor文を使います。

""" Mは発言数 """
# 各発言について処理を行う
for _ in range(M):
    # 各発言の単語
    said = input()

for文についてはこちらをご参考ください!

次に発言内容がしりとりのルールを守っているかを判定し

それぞれの場合に上記で述べた処理を行います。

""" Mは発言数 """
# 各発言について処理を行う
for _ in range(M):
    # 発言した単語
    said = input()
    
    """ wordsは単語リスト、numは参加人数、usedは使用済みリスト """
    # 単語リストに存在しない、使用済みリストに存在する、最後の文字が'z'場合
    if said[-1] == 'z' or not said in words or said in used:
        # 人数を1人減らす
        N -= 1
        # しりとりが最初からになる
        init = True
        # ルールを破った場合
        member.pop(index)
        # 1を引く
        index -= 1
        
    else:
        # 最初の人ではない場合
        if not init:
            # 頭文字が直前の最後の文字と違う場合
            if not used[-1][-1] == said[0]:
                # 人数を1人減らす
                N -= 1
                # しりとりが最初からになる
                init = True
                # ルールを破った場合
                member.pop(index)
                # 1を引く
                index -= 1
            # 頭文字が直前の最後の文字と同じ場合
            else:
                # 使用済みリストに単語を追加
                used.append(said)
                # しりとりを続ける
                init = False
        # 最初の人の場合            
        else:
            # 使用済みリストに単語を追加
            used.append(said)
            # しりとりを続ける
            init = False

そして次の人に移るために、何番目かの変数に処理を加えます。

""" Mは発言数 """
# 各発言について処理を行う
for _ in range(M):
    # 発言した単語
    said = input()
    
    """ wordsは単語リスト、numは参加人数、usedは使用済みリスト """
    # 単語リストに存在しない、使用済みリストに存在する、最後の文字が'z'場合
    if said[-1] == 'z' or not said in words or said in used:
        # 人数を1人減らす
        N -= 1
        # しりとりが最初からになる
        init = True
        # ルールを破った場合
        member.pop(index)
        # 1を引く
        index -= 1
        
    else:
        # 最初の人ではない場合
        if not init:
            # 頭文字が直前の最後の文字と違う場合
            if not used[-1][-1] == said[0]:
                # 人数を1人減らす
                N -= 1
                # しりとりが最初からになる
                init = True
                # ルールを破った場合
                member.pop(index)
                # 1を引く
                index -= 1
            # 頭文字が直前の最後の文字と同じ場合
            else:
                # 使用済みリストに単語を追加
                used.append(said)
                # しりとりを続ける
                init = False
        # 最初の人の場合            
        else:
            # 使用済みリストに単語を追加
            used.append(said)
            # しりとりを続ける
            init = False

    # 次に人に移る
    index += 1
    # 残っている人数を超えたら最初に戻る
    if index >= N:
        index = 0

if文については、こちらをご参考ください!

結果を出力

最後は「結果を出力」です。

今回の問題では最終的な結果として

残っている人数と何番目の人が残っているを出力します。

# 何人残っているかを出力
print(N)

# 何番目の人が残っているかを出力
for num in member:
    print(num+1)

解答

まとめると解答は以下です。

# N,K,Mがそれぞれ人数、単語数、発言数
N, K, M = [int(x) for x in input().split()]

""" Kは単語数 """
# 単語リスト
words = [input() for x in range(K)]

# 使用済みリスト
used = []
# 最初の人かを判定する変数
init = True

""" Mは参加する人数 """
# 何番目の人が残っているかのリスト
member = list(range(N))
# 発言した人が何番目かの変数
index = 0

""" Mは発言数 """
# 各発言について処理を行う
for _ in range(M):
    # 発言した単語
    said = input()
    
    """ wordsは単語リスト、numは参加人数、usedは使用済みリスト """
    # 単語リストに存在しない、使用済みリストに存在する、最後の文字が'z'場合
    if said[-1] == 'z' or not said in words or said in used:
        # 人数を1人減らす
        N -= 1
        # しりとりが最初からになる
        init = True
        # ルールを破った場合
        member.pop(index)
        # 1を引く
        index -= 1
        
    else:
        # 最初の人ではない場合
        if not init:
            # 頭文字が直前の最後の文字と違う場合
            if not used[-1][-1] == said[0]:
                # 人数を1人減らす
                N -= 1
                # しりとりが最初からになる
                init = True
                # ルールを破った場合
                member.pop(index)
                # 1を引く
                index -= 1
            # 頭文字が直前の最後の文字と同じ場合
            else:
                # 使用済みリストに単語を追加
                used.append(said)
                # しりとりを続ける
                init = False
        # 最初の人の場合            
        else:
            # 使用済みリストに単語を追加
            used.append(said)
            # しりとりを続ける
            init = False

    # 次に人に移る
    index += 1
    # 残っている人数を超えたら最初に戻る
    if index >= N:
        index = 0

# 何人残っているかを出力
print(N)

# 何番目の人が残っているかを出力
for num in member:
    print(num+1)

ぜひご参考ください!

スポンサーリンク

まとめ

今回はpaizaのレベルアップ問題集の中で

  • みんなでしりとり! (paizaランク B 相当)

の解答と解説を紹介しました。

Bランクの問題になると、問題文が長くなり理解が難しくなります。

しかし問題を誤解していたことに後から気づいてやり直すと

大幅な時間のロスになってしまい

おそらくランクアップすることが出来ません。

まずは焦らず問題をちゃんと理解するように心がけましょう!

また他のレベルアップ問題集の問題についての解説も、ぜひご参考ください!

Pythonを学びたいと思っているけど

  • プログラミングスクールに数十万円も払えない・・・
  • 独学だとどうやって学んだらいいかわからない・・・
  • Pythonのインストールや環境構築がよくわからない・・・

といったお悩みを抱えている方はいませんか?

Pythonの学習はオンライン学習サービスのPyQがおすすめです!

PyQ

PyQの特徴は圧倒的なコストパフォーマンスで

たった月額3,040円で以下のPythonに関する内容が学び放題です!

PyQで学べる内容
  • プログラミングの基本
  • Python入門〜中級
  • ユニットテスト、設計
  • Webアプリ開発
  • Django(Pythonを使ったWebアプリ開発のフレームワーク)
  • スクレイピング
  • データ解析
  • 機械学習
  • 統計入門
  • アルゴリズム

またブラウザ上でコードを書いて学習できるため

面倒なPythonのインストールや環境構築なども一切不要です!

実際に私もプログラミングを始めた頃に利用していて

PyQを一通りやり終えた後は

  • Djangoを使ったポートフォリオの制作
  • スクレイピングによる作業の自動化
  • ディープラーニング

などのプログラムを自分で書けるようになり

paizaのスキルチェックでもSランクを所得しました!

PyQは登録後すぐに学習を開始できるので

Pythonの学習方法でお悩みの方は、今すぐPyQで学習をスタートしましょう!

しかし

  • 独学で挫折した経験がある・・・
  • 短期間でpythonを習得したい!
  • プロのエンジニアからpythonを学びたい!

という方は、PyQでの独学よりも

プログラミングスクールでの学習が最適かもしれません!

pythonが学べるおすすめのプログラミングスクールはこちら!

TechAcademy Pythonコース

おすすめスクールNo.1:TechAcademy Pythonコース

TechAcademyがおすすめな理由
  • 学習システムを1週間無料で体験できる!
  • 完全オンラインだから、忙しくても続けられる!
  • 各受講生に現役エンジニアのメンターがつく!

DIVE INTO CODE エキスパートAIコース

おすすめスクールNo.2:DIVE INTO CODE エキスパートAIコース

DIVE INTO CODEがおすすめな理由
  • 本気の人のためのスクール!事前テストで選考あり!
  • 無料説明会&体験セミナーあり!
  • 通学 or オンラインが選択できる!

CodeCamp Pythonデータサイエンスコース

おすすめスクールNo.3:CodeCamp Pythonデータサイエンスコース

DIVE INTO CODEがおすすめな理由
  • 無料体験レッスン受講で10,000円引き
  • 受講者数30,000人超えの圧倒的な実績!
  • レッスン満足度96.6%

ぜひ自分に合った学習方法でPythonを習得しましょう!

プログラミング paizaでSランク!
スポンサーリンク
Follow Me!
スポンサーリンク
まろぶろぐ
タイトルとURLをコピーしました