paizaラーニング リアルイベント問題セット: 雪だるま作り(Python 解答例 )

スポンサーリンク

はじめに

paizaラーニングの「リアルイベント問題セット」にある「雪だるま作り」という問題に挑戦したところ、少し苦労した。総当りでやれば解けることは直感的に分かるが、与えられる数値を見る限りそれでは大規模データでタイムアウトすることが明白だったため、効率的な方法を考える必要があった。誰かが書いた模範解答を参考にしようかと思ったが、記事執筆時点ではどこにもどの言語でも模範解答が載っていないので、自分の書いたものを載せてみることにする。初心者が書いたコードなので洗練されていないが、ご容赦いただきたい。

paizaの問題へのリンク(リアルイベント問題セット:雪だるま作り (paizaランク A 相当)

(プログラミング初心者による)解説

基本部分

whileループに入る前の簡単な処理。意味はコード内のコメントで書いた。

n, k = map(int, input().split())
l1 = [int(_) for _ in input().split()]
l1 = sorted(l1)  # 以後の処理のため、リストをソート
t1 = 0  # 組み合わせが成立した時にカウントする変数

組み合わせを確認するwhileループ

リストの中身がソートされているので、最大値を最初に取り出して、最小値をぶつけて組み合わせを確認していく。組み合わせがkに満たない場合は取得した最小値を捨てて次の最小値を取りに行く。リストの中身が無くなったらループから抜ける。

while True:
    high = l1.pop(-1)  # リストの一番後ろから最大値を取得
    while True:
        low = l1.pop(0)  # リストの一番前から最小値を取得
        if high + low >= k:
            t1 += 1  # 組み合わせがk以上の値だった場合はカウントする
            break
        else:
            if len(l1) < 1:  # リストの中身が空になったら抜ける
                break

    if len(l1) < 2:  # リストの要素が2未満になったら外側のループからも抜ける
        break

print(t1)

コード全体

n, k = map(int, input().split())
l1 = [int(_) for _ in input().split()]
l1 = sorted(l1)
t1 = 0

while True:
    high = l1.pop(-1)
    while True:
        low = l1.pop(0)
        if high + low >= k:
            t1 += 1
            break
        else:
            if len(l1) < 1:
                break

    if len(l1) < 2:
        break

print(t1)

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

コメント

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

Please disable your adblocker or whitelist this site!

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