この記事では
プログラミング学習サービスpaizaラーニングの
スキルチェックレベルアップ問題集をわかりやすく解説します!
プログラミング言語はpythonです。
今回はBランク相当の以下の問題を解説します。
他のレベルアップ問題集のの解答と解説もしているので
ぜひご参考ください!
またpaizaの各ランクの攻略法は
こちらで詳しく紹介しているので、ぜひご参考ください!
この問題を解くための3つのポイント
まずは「この問題を解くためのポイント」をご説明します。
問題はこちらからご確認ください。
この問題を解くためのポイントは3つです。
- トランプの初期配置の入力を受け取る
- めくったカードが揃ったか判定
- 各プレイヤーのトランプの枚数をカウント
トランプの初期配置の入力を受け取る
まずは「トランプの初期配置の入力を受け取る」です。
今回の問題では
1行目でトランプの初期配置の縦の枚数と横の枚数が入力され
2行目以降の(縦の枚数+1)行で、
1 2 3 4
のように各トランプの数字が半角スペース区切りで入力されます。
入力については、こちらをご参考ください!
"""
Hは初期配置の縦の枚数
"""
# 初期配置のリストを定義
init_cards = []
# 縦の枚数だけ繰り返す
for _ in range(H):
# 各行のトランプの数字をリストに追加
init_cards.append(input().split())
# init_cardsには以下のように代入される
"""
[
['1', '2', '3', '4'],
['5', '6', '7', '8'],
['1', '2', '3', '4'],
]
"""
リストとfor文については、こちらをご参考ください!
また内包表記を使うと、さらにシンプルです。
"""
Hは初期配置の縦の枚数
"""
# 初期配置
init_cards = [input().split() for _ in range(H)]
内包表記については、こちらをご参考下さい!
めくった2枚のカードが揃ったか判定
次は「めくった2枚のカードが揃ったか判定」です。
今回の問題ではトランプの初期配置が入力された後
めくった回数が入力され、それ以降の(めくった回数)行で
めくったトランプの縦横の位置が半角スペース区切りで入力されます。
そのため内包表記を使った入力の受け取りを
めくった回数だけfor文で繰り返します。
"""
Lはめくった回数
"""
# めくった回数だけ繰り返す
for i in range(L):
# めくったトランプの縦横の位置をint型に変換し、1引いた後、変数に代入
a, b, A, B = [int(x)-1 for x in input().split()]
入力された縦横の位置をint型に変換し、1引きます!
int型への変換や引き算については、こちらをご参考ください!
次にif文を使って
「めくった2枚のカードが揃ったか」で条件分岐を行います。
そのためトランプの縦横の位置を
インデックスとしてリストの要素を指定し同じ数字か判定します。
# めくった回数だけ繰り返す
for i in range(L):
# めくったトランプの縦横の位置をint型に変換し、1引いた後、変数に代入
a, b, A, B = [int(x)-1 for x in input().split()]
# 2枚のカードが揃った場合
if init_cards[a][b] == init_cards[A][B]:
# 揃った場合の処理
else:
# 揃わなかった場合の処理
if文については、こちらをご参考ください!
各プレイヤーのトランプの枚数をカウント
最後は「各プレイヤーのトランプの枚数をカウント」です。
今回の問題では最終的な結果として
各プレイヤーが取ったトランプの枚数を出力しなければなりません。
そのため、トランプの枚数をリストを使ってカウントします。
まずは長さがプレイヤーの人数で要素がすべて0
のリストを定義します。
"""
Nはプレイヤーの人数
"""
# 各プレイヤーのトランプの枚数のリストを定義
results = [0] * N
次にプレイヤーを指定する変数を定義し
カードが揃った場合にそのプレイヤーの枚数を2
増やします。
# 各プレイヤーのトランプの枚数のリストを定義
results = [0] * N
# プレイヤーを指定する変数を定義
who = 0
# めくった回数だけ繰り返す
for i in range(L):
# めくったトランプの縦横の位置をint型に変換し、1引いた後、変数に代入
a, b, A, B = [int(x)-1 for x in input().split()]
# 2枚のカードが揃った場合
if init_cards[a][b] == init_cards[A][B]:
# プレイヤーのトランプの枚数を2増やす
results[who] += 2
else:
# 揃わなかった場合の処理
最後に揃わなかった場合に、次のプレイヤーに番を移します。
else:
# 次のプレイヤーの番に移る
who = (who + 1) % N
ここで最後のプレイヤーの次は、最初のプレイヤーに戻るため
プレイヤーの人数で割った余りを計算します!
余りの計算については、こちらをご参考ください!
またカードが揃った場合は、
同じプレイヤーが続けてカードをめくるので処理は必要ありません。
みんなでしりとり!(paizaランク B 相当)の解答
ではここまで紹介したポイントを使って、問題を解いていきます。
入力を受け取り、リストや変数を準備
まずは「入力を受け取り、リストや変数を準備」です。
今回の問題では最初に
- トランプの初期配置の縦の枚数
- トランプの初期配置の横の枚数
- プレイヤーの人数
が半角スペース区切りで1行で入力されます。
さらにint型にも変換します。
# H, W, Nがそれぞれ縦の枚数、横の枚数、プレイヤーの人数
H, W, N = [int(x) for x in input().split()]
内包表記については、こちらをご参考ください!
次にトランプの初期配置が入力されるので
内包表記を使って入力を受け取ります。
# H, W, Nがそれぞれ縦の枚数、横の枚数、プレイヤーの人数
H, W, N = [int(x) for x in input().split()]
# 初期配置の入力を受け取る
init_cards = [input().split() for _ in range(H)]
次にトランプをめくった回数が入力されるので
int型に変換し変数に代入します。
# H, W, Nがそれぞれ縦の枚数、横の枚数、プレイヤーの人数
H, W, N = [int(x) for x in input().split()]
# 初期配置の入力を受け取る
init_cards = [input().split() for _ in range(H)]
# めくった回数
L = int(input())
int型への変換については、こちらをご参考ください!
めくったトランプの縦横の位置の入力を受け取ります。
# H, W, Nがそれぞれ縦の枚数、横の枚数、プレイヤーの人数
H, W, N = [int(x) for x in input().split()]
# 初期配置の入力を受け取る
init_cards = [input().split() for _ in range(H)]
# めくった回数
L = int(input())
# めくった回数だけ繰り返す
for i in range(L):
# めくったトランプの縦横の位置をint型に変換し、1引いた後、変数に代入
a, b, A, B = [int(x)-1 for x in input().split()]
for文については、こちらをご参考ください!
そして以降の処理のために
- 各プレイヤーの取ったトランプの枚数のリスト
- プレイヤーを指定する変数
の2つを定義します。
# H, W, Nがそれぞれ縦の枚数、横の枚数、プレイヤーの人数
H, W, N = [int(x) for x in input().split()]
# 初期配置の入力を受け取る
init_cards = [input().split() for _ in range(H)]
# めくった回数
L = int(input())
# 各プレイヤーのトランプの枚数のリストを定義
results = [0] * N
# プレイヤーを指定する変数を定義
who = 0
# めくった回数だけ繰り返す
for i in range(L):
# めくったトランプの縦横の位置をint型に変換し、1引いた後、変数に代入
a, b, A, B = [int(x)-1 for x in input().split()]
めくったカードが揃ったか判定し、各プレイヤーの枚数を計算
次は「めくったトランプが揃ったか判定し、各プレイヤーの枚数を計算」です。
まずは「めくったカードが揃ったか」で
if文を使って条件分岐を行います。
# めくった回数だけ繰り返す
for i in range(L):
# めくったトランプの縦横の位置をint型に変換し、1引いた後、変数に代入
a, b, A, B = [int(x)-1 for x in input().split()]
# 2枚のカードが揃った場合
if init_cards[a][b] == init_cards[A][B]:
# 揃った場合の処理
else:
# 揃わなかった場合の処理
if文についてはこちらをご参考ください!
次に揃った場合に、各プレイヤーの枚数を2増やし
揃わなかった場合は、次のプレイヤーの番に移ります。
# めくった回数だけ繰り返す
for i in range(L):
# めくったトランプの縦横の位置をint型に変換し、1引いた後、変数に代入
a, b, A, B = [int(x)-1 for x in input().split()]
# 2枚のカードが揃った場合
if init_cards[a][b] == init_cards[A][B]:
# プレイヤーのトランプの枚数を2増やす
results[who] += 2
else:
# 次のプレイヤーの番に移る
who = (who + 1) % N
結果を出力
最後は「結果を出力」です。
今回の問題では最終的な結果として
改行区切りで各プレイヤーの取った枚数を出力します。
# プレイヤーごとに繰り返す
for res in results:
# 取った枚数を出力
print(res)
出力についてはこちらをご参考ください!
解答
まとめると解答は以下です。
# H, W, Nがそれぞれ縦の枚数、横の枚数、プレイヤーの人数
H, W, N = [int(x) for x in input().split()]
# 初期配置の入力を受け取る
init_cards = [input().split() for _ in range(H)]
# めくった回数
L = int(input())
# 各プレイヤーのトランプの枚数のリストを定義
results = [0] * N
# プレイヤーを指定する変数を定義
who = 0
# めくった回数だけ繰り返す
for i in range(L):
# めくったトランプの縦横の位置をint型に変換し、1引いた後、変数に代入
a, b, A, B = [int(x)-1 for x in input().split()]
# 2枚のカードが揃った場合
if init_cards[a][b] == init_cards[A][B]:
# プレイヤーのトランプの枚数を2増やす
results[who] += 2
else:
# 次のプレイヤーの番に移る
who = (who + 1) % N
# プレイヤーごとに繰り返す
for res in results:
# 取った枚数を出力
print(res)
ぜひご参考ください!
まとめ
今回はpaizaのレベルアップ問題集の中で
- 神経衰弱 (paizaランク B 相当)
の解答と解説を紹介しました。
Bランクの問題になると、問題文が長くなり理解が難しくなります。
しかし問題を誤解していたことに後から気づいてやり直すと
大幅な時間のロスになってしまい
おそらくランクアップが出来ません。
まずは焦らず問題をちゃんと理解するように心がけましょう!
また他のレベルアップ問題集の解説も、ぜひご参考ください!