[python/アルゴリズム]プログラマーKAKAO BLIND RECRUIMENT第1ラウンドダーツゲーム


質問する


https://programmers.co.kr/learn/courses/30/lessons/17682

入力フォーマット


「スコア|加算|オプション」からなる文字列3組.
例)1 S 2 D*3 T
  • 分は0から10の整数です.
  • ボーナスはS、D、Tの1つです.
  • オプティカル(光学式)ドライブは*または#のいずれかで、ない場合があります.
  • に答える


    一番大切な部分は?🤔


    この問題を解くとき、一番大切な部分は文字列を区切ることだと思います!!
    文字列3集は何の基準もなく書かれているので、簡単にsplitに分けることもできないので、解答の最大比重を占めているのではないかと思います.
    実は私はここで最も多くぶらぶらしています!!ははは

    Pythonの正規表現


    正規表現は一連の規則を利用する.
    複雑な文字列の検索と置換にはPythonだけでなく文字列を扱うすべての場所で使用されます.
    この問題は、点数(数字)|加点(3文字)|オプション(2文字)の形で繰り返される文字列も使用されるので、正規表現を使用するのに適しています!
    正規表現は、詳細に記載されたブログを参照する.
    import re
    p = re.compile('(\d*)([SDT])([*#]?)')
        result = p.findall(dartResult)
    reモジュールのcompile関数により,正規表現のモードオブジェクトを得ることができる.このオブジェクトでは、文字列を一致させて、必要なフォーマットの文字列を得ることができます.
    モードオブジェクトをpという変数に含め、一致するすべての関数を検索することで、3つの文字列を分離できます.🥳
    現在、ダーツゲームを3回分離した結果、点数の計算しか残っていません.
    まず共通の計算過程を解決しなければならない.
    これはディックの資料構造とともに使われている.キー値を文字に置くことで、対応する文字であればボーナスがもらえ、コードの効率が向上します.
    通常、
  • 各機会に獲得されたスコアとボーナス
  • オプションアプリケーション
  • 特別な場合.
  • スター賞*を受賞し、以前にもスター賞*を受賞した場合は
  • を獲得する
    最終コードは次のとおりです.
    import re
    def solution(dartResult):
        score = []
        # 라운드마다 점수 나누기 -> 정규표현식 사용
        p = re.compile('(\d*)([SDT])([*#]?)')
        result = p.findall(dartResult)
        
        bonus = {'S': 1, 'D': 2, 'T': 3}
        options = {'': 1, '*': 2, '#': -1}
        
        for i, res in enumerate(result):
            if i>0 and res[2] == '*':
                score[i-1] = score[i-1]*options[res[2]]
            score.append(int(res[0])**bonus[res[1]]*options[res[2]])
        
        return sum(score)
    
    スコアを表す変数は、次の理由で各機会にスコアを入力するためにリストを使用します.
    前述のような特殊な条件があるので、以前の機会に得た点数を利用します.
    だから最後にsum関数でリストのすべての要素の値を一緒に渡して、終わりました!

    レベル1問題なので難しい問題ではありませんが初めてのKakao問題なので嬉しいです😆