あるエンジニアのAtCoder奮闘記

東京都港区にあるアミフィアブル株式会社のエンジニアが、AtCoderで解いた問題について振り返ったりしていく会社公認のブログです。

Paiza プログラミング練習問題 A - じゃんけんの手の出し方 (Python)

irisruneです。普段はAtCoderの問題を解いていますが、弊社がPaizaで求人を出していることもあって今回はPaiza プログラミング練習問題を解く記事を出してみました。

問題

paiza.jp

(タイトルからわかりにくいと思いますが、問題ページへのリンクです。)

Aランク相当ではありますが正解率が低めで、下手なSランク問題より苦戦する人もいるかと思います。制約がN\leq10^3と緩いのがポイントです。

import sys
import numpy as np


def main():
    n, m = [int(x) for x in input().split()]
    s = input()
    hand = [0, 0, 0]
    for h in s:
        if h == 'G':
            hand[0] += 1
        elif h == 'C':
            hand[1] += 1
        elif h == 'P':
            hand[2] += 1
    ans = 0
    for gi in range(n + 1):
        for ci in range((n + 1) - gi):
            pi = n - gi - ci
            if (gi * 0) + (ci * 2) + (pi * 5) == m:
                ans = max(ans, min(gi, hand[1]) + min(ci, hand[2]) + min(pi, hand[0]))
    print(ans)


main()

解き方としては、グー、チョキ、パーを出す回数の組み合わせを全探索して、指の本数がMと一致する組み合わせについて最も多く勝った回数を出力すればよいです。グー、チョキの出す回数が決まればパーの出す回数は一意に決まるので組み合わせの数はO(N^2)ですね。

グー、チョキ、パーを出す回数からじゃんけんに勝った回数を求める部分については、相手の出すグー、チョキ、パーの回数を数えておいて対応する手を出した回数を計算すればよいです。

じゃんけんに負けた回数も考える必要がある場合は少々難易度が上がると思いますが、今回の条件であれば全探索に気付くことができれば容易に求めることができると思います。

宣伝

弊社のPaiza求人紹介です。

少人数ながら多種多様なスキルとバックグラウンドを持ったエンジニアが集まっていることが弊社のエンジニア集団の面白いところ、いうことで、4つのポジションで募集を出しております。

それぞれ応募要件や条件等が異なりますが、惹かれる記事がありましたら、是非「気になる」に登録してみてください。 (ちなみに、筆者は開発ラボの所属です)

雑記

  • 当初は全勝した場合の指の本数を計算して、そこから指の本数がMになるよう調整するという方針で考えていましたが色々と複雑になったのでなかったことになりました。
  • S問題、A問題をざっと見た感じ、十億連勝以外は解く方針が見えている(or既に解いた)ので不定期に取り扱うと思います。
  • PaizaはPythonなどの制限時間が15秒と長めなのもあり、言語による有利不利が少なめな気がします(ないこともないです)。
  • 弊社採用担当がノベルティを頂いているので画像を貼っておきます。 f:id:amifiable:20190614160906p:plain