pandasでpaiza問題(スキルチェック見本問題セット:長テーブルのうなぎ屋)

スポンサーリンク

paizaへのリンク(スキルチェック見本問題セット:長テーブルのうなぎ屋 (paizaランク B 相当)

数カ月ぶりにこの問題にチャレンジしたら簡単にロジックが思いついて解答することが出来た。プログラミング的な思考のコツが少しは分かってきたのかもしれない。上にpandasを使った方法、下には普通の回答方法を掲載する。基本的なロジックは同じ。

dct1で座席数分の辞書の枠を作り、空席ならば0、埋まっていれば1を入れて管理する。最初のforループでは空席確認を行い、そこで引っかかるようならばcheckerを1にしてbreakにてループを終える。checkerが0のまま空席確認が終われば、dataframeの値を1に入れ替えるループ処理を行う。

辞書(dictionary)からpandasのDataframeを作るやり方はDataFrame.from_dict()ということを今回知った。最初はエラーが出てきたのだが、なんとなくorient=’index’を使ったら上手いこと出来た。公式ドキュメントはこちら

import pandas as pd

n, m = [int(_) for _ in input().split()]
dct1 = {}

for i in range(n):
    dct1[i + 1] = 0

df1 = pd.DataFrame.from_dict(dct1, orient='index')

for i in range(m):
    a, b = [int(_) for _ in input().split()]
    checker = 0
    for j in range(a):
        check_seat = j + b
        while check_seat > n:
            check_seat -= n
        if df1.iat[check_seat - 1, 0] == 1:
            checker = 1
            break

    if checker == 0:
        for j in range(a):
            take_seat = j + b
            while take_seat > n:
                take_seat -= n
            df1.iat[take_seat - 1, 0] = 1

print(df1.iloc[:, 0].sum())

普通の解法

n, m = [int(_) for _ in input().split()]
dct1 = {}

for i in range(n):
    dct1[i + 1] = 0

for i in range(m):
    a, b = [int(_) for _ in input().split()]
    checker = 0
    for j in range(a):
        check_seat = j + b
        while check_seat > n:
            check_seat -= n
        if dct1[check_seat] == 1:
            checker = 1
            break

    if checker == 0:
        for j in range(a):
            take_seat = j + b
            while take_seat > n:
                take_seat -= n
            dct1[take_seat] = 1

print(sum(dct1.values()))

「pandasでpaiza問題」記事一覧へのリンク

コメント

当ブログのコンテンツが気に入ったら広告ブロックの解除(ホワイトリスト化)をご検討下さい。

Please disable your adblocker or whitelist this site!

タイトルとURLをコピーしました