この記事では
プログラミング学習サービスpaizaラーニングの
スキルチェックレベルアップ問題集の問題をわかりやすく解説します!
プログラミング言語はpythonです。
今回はBランク相当の以下の問題を解説します。
他のレベルアップ問題集の解答と解説も紹介しているので
ぜひご参考ください!
またpaizaの各ランクの攻略法は
こちらで詳しく紹介しているので、ぜひご参考ください!
この問題を解くための3つのポイント
まずは「この問題を解くためのポイント」をご説明します。
この問題を解くためのポイントは以下の3つです。
- 空席かどうかを判定
- 空席から着席に変換
- 着席数をカウント
空席かどうかを判定
まずは「空席かどうかを判定」です。
今回の問題では入店したグループが1列に座れる場合のみ着席します。
そのため「入店した人数分の連続した座席が空席かどうか」
を判定しなければなりません。
今回は座席と同じ長さのリストを用意し
リストの要素がTrue
なら着席、False
なら空席として考えていきます。
# 1番目と3番目が着席
seats = [True, False, False, True]
そして「入店した人数分の連続した座席が空席かどうか」は
リストをスライスして、in演算子を使って判定します。
# 1番目と3番目が着席
seats = [True, False, False, True]
# 2番目から3番目を抜き出す
print(seats[1:3])
# [False, False]と出力
# Trueが含まれているか
print(True in seats[1:3])
# Falseと出力
リストについては、こちらをご参考ください!
空席から着席に変換
次は「空席から着席に変換」です。
今回の問題では入店するグループの人数と着席する座席の始点が入力されます。
そのためリストをスライスして要素をTrue
に変換することで
空席から着席に変換します。
# 1番目と3番目が着席
seats = [True, False, False, True]
# 2番目から3番目をTrueに変換
seats[1:3] = [True, True]
# [True, True, True, True]と出力
print(seats)
また同じ要素のリストは*
を使ってよりシンプルに書くことが出来ます。
# 1番目と3番目が着席
seats = [True, False, False, True]
# 2番目から3番目をTrueに変換
seats[1:3] = [True] * 2
# [True, True, True, True]と出力
print(seats)
着席数をカウント
最後は「着席数をカウント」です。
今回の問題では「最終的に着席している人数」が出力結果として必要です。
そのためcountメソッドを使って
リストの中のTrue
をカウントして出力します。
(リスト).count((変数など))
# 1番目と3番目が着席
seats = [True, False, False, True]
# Trueをカウントする
print(seats.count(True)) # 2と出力
出力については、こちらをご参考ください!
長テーブルのうなぎ屋 (paizaランク B 相当)の解答
ではここまで紹介したポイントを使って、問題を解いていきます。
1行目の入力から座席のリストを定義
まずは「1行目の入力から座席のリストを定義」です。
今回の問題では1行目で座席数とグループの数が
半角スペース区切りで入力されます。
そのためsplit関数を使って2つの変数に代入し、int型に変換します。
# 座席数とグループの数の入力を受け取る
num_s, num_g = input().split()
# int型に変換
num_s = int(num_s)
num_g = int(num_g)
int型などの変数の型については、こちらをご参考ください!
また内包表記を使うと1行で書けるため、よりシンプルです。
# 座席数とグループの数の入力を受け取り、int型に変換
num_s, num_g = [int(x) for x in input().split()]
内包表記については、こちらをご参考ください!
次に要素が全てFalse
のリストを定義します。
# 座席数とグループの数の入力を受け取り、int型に変換
num_s, num_g = [int(x) for x in input().split()]
# 長さがnum_s、要素が全てFalseのリストを定義
seats = [False] * num_s
リストについては、こちらをご参考ください!
2行目の入力を受け取り、空席か判定後に着席に変換
次は「2行目の入力を受け取り、空席か判定後に着席に変換」です。
2行目以降ではグループの人数と着席する始点が
半角スペース区切りで入力されるため
1行目と同様にsplit関数と内包表記を使って入力を受け取ります。
# 人数と始点の入力を受け取り、int型に変換
num, init = [int(x) for x in input().split()]
次に入力された値でリストをスライスし
if文で空席かどうか判定した後に、空席の場合のみ着席に変換します。
座席の終点は「始点+人数」で求めます。
# 人数と始点の入力を受け取り、int型に変換
num, init = [int(x) for x in input().split()]
# リストをスライスし、Trueが無いか判定
if not True in seats[init - 1 : init + num - 1]: # Trueが無い時
# 全てTrueに変換
seats[init - 1 : init + num - 1] = [True] * num
ただし入力された始点の値だと、リストのインデックスよりも1大きいため
init
から1を引いていることに注意しましょう!
if文については、こちらをご参考ください!
3行目以降も同じ処理を繰り返し、最後に結果を出力
最後は「3行目以降も同じ処理を繰り返し、最後に結果を出力」です。
2行目の入力から着席に変換するまでの処理を
グループの数だけfor文で繰り返します。
# グループの数だけ繰り返す
for _ in range(num_g):
# 人数と始点の入力を受け取り、int型に変換
num, init = [int(x) for x in input().split()]
# リストをスライスし、Trueが無いか判定
if not True in seats[init - 1 : init + num - 1]: # Trueが無い時
# 全てTrueに変換
seats[init - 1 : init + num - 1] = [True] * num
for文については、こちらをご参考ください!
全ての入力に対して処理が終わった後に
着席の数をカウントして出力します。
# seatsの中のTrueをカウントして出力
print(seats.count(True))
出力については、こちらをご参考ください!
解答
まとめると解答は以下です。
# 座席数とグループの数の入力を受け取り、int型に変換
num_s, num_g = [int(x) for x in input().split()]
# 長さがnum_s、要素が全てFalseのリストを定義
seats = [False] * num_s
# グループの数だけ繰り返す
for _ in range(num_g):
# 人数と始点の入力を受け取り、int型に変換
num, init = [int(x) for x in input().split()]
# リストをスライスし、Trueが無いか判定
if not True in seats[init - 1 : init + num - 1]: # Trueが無い時
# 全てTrueに変換
seats[init - 1 : init + num - 1] = [True] * num
# seatsの中のTrueをカウントして出力
print(seats.count(True))
ぜひご参考ください!
まとめ
今回はpaizaのスキルチェックの練習問題である
の解答と解説を紹介しました。
Bランクの問題になると、問題文が長くなり理解が難しくなります。
しかし問題を誤解していたことに後から気づいてやり直すと
大幅な時間のロスになってしまい
おそらくランクアップすることが出来ません。
まずは焦らず問題をちゃんと理解するように心がけましょう!
また他のレベルアップ問題集の問題の解答と解説も、ぜひご参考ください!