211216-N表示


Nと表示:プログラマーLEVEL 3
  • https://programmers.co.kr/learn/courses/30/lessons/42895
  • 質問する
    以下に示すように、5と4の演算を使用して12を表すことができます.
    12 = 5 + 5 + (5/5) + (5/5)
    12 = 55/5 + 5/5
    12 = (55 + 5)/5
    5の使用回数はそれぞれ6,5,4である.その中で一番小さいのは4です.
    Nとnumberが与えられた場合、Nと4則演算のみを使用するN使用回数の最高値を返すために、解法関数を作成します.
    入力
  • Nは1または9未満です.
  • は32000より大きい番号です.
  • 式では、カッコとスラッシュの演算のみが許可され、除算演算で残りの部分は無視されます.
  • しゅつりょく
  • N使用回数の最小値
  • ピーク
  • が8より大きい場合は、-1を返します.
  • I/O例
    Nnumberreturn51242113
    のり付け
    1.解説
  • の各回数で作成された数は、見つけて解決できます.
  • 使用回数Iであれば、以下の数を作成することができる.
    1個
  • (NN...N):長さI
  • i次因数とj次因数の4則演算結果(ただしi+j=I)
  • の回数は1から8まで繰り返し,numberが存在する回数を探す.
  • が存在しなければ、以上の回数で-1を返却します.
  • 2.プログラム
  • dp宣言
  • 回が1の場合、追加
  • 回数が2~8の場合に追加
  • 使用回数Iは
  • を示す.
    1個
  • (NN...N):長さI
  • i次因数とj次因数の4則演算結果(ただしi+j=I)
  • 回行い、number回の有無を確認する
  • が存在する場合、対応する回数
  • が返される.
  • が存在しない場合、
  • が実行されます.
  • の回数がない場合は、-1
  • を返す.
    # 코드
    def solution(N, number):
        answer = -1
        dp = {i : set() for i in range(1, 9)}
        
        if N == number:
            answer = 1
            return answer
    
        dp[1].add(N)
        for i in range(2, 9):
            dp[i].add(int(str(N)*i))
            for half in range(1, i//2+1):
                for x in dp[half]:
                    for y in dp[i-half]:
                        add, minus1, minus2, mul = x+y, x-y, y-x, x*y
                        if 0 < add <= 32000 :
                            dp[i].add(add)
                        if 0 < minus1 <= 32000:    
                            dp[i].add(minus1)
                        if 0 < minus2 <= 32000:
                            dp[i].add(minus2)
                        if 0 < mul <= 32000:
                            dp[i].add(mul)
                            
                        if y != 0:
                            quotient, mod = divmod(x, y)
                            if mod == 0 and 0 < quotient <= 32000:
                                dp[i].add(quotient)
                        if x != 0:
                            quotient, mod = divmod(y, x)
                            if mod == 0 and 0 < quotient <= 32000:
                                dp[i].add(quotient)
            if number in dp[i]:
                answer = i
                return answer
    
        return answer