[プログラマー]Nと表示
https://programmers.co.kr/learn/courses/30/lessons/42895
1.完全なコード
1.完全なコード def solution(N, number):
answer = -1
if N == number:
return 1
d = [set() for i in range(9)]
for i in range(1, 9):
d[i].add(int(str(N) * i)) # [5, 55, 555, 5555...]
for i in range(2, 9):
for j in range(1, i):
# 예) 5자리 숫자를 만들기 위해서는
# 1+4, 2+3, 3+2, 4+1 네 개의 경우가 존재한다.
# [j] 와 [i-j] 의 합은 항상 5가 나온다.
for op1 in d[j]:
for op2 in d[i-j]:
d[i].add(op1 + op2)
d[i].add(op1 - op2)
d[i].add(op1 * op2)
if op2 != 0:
d[i].add(op1 // op2)
if number in d[i]:
answer = i
break
return answer
solution(5, 12)
2.後期
この間,DP問題を解く際にnumberに対応するdpテーブルを作成し,1から値を充填し,既存値を用いてd[number]を求める.しかし、この問題はそんなことはできません.
N使用回数(1~8)に適合するDPテーブルを全て記憶することは考えにくい.思いもよらなかった.この問題はdpの原因であり[j]と[i−j]が既存値を利用する部分から確認できる.
Reference
この問題について([プログラマー]Nと表示), 我々は、より多くの情報をここで見つけました
https://velog.io/@legowww/프로그래머스-N으로-표현
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
def solution(N, number):
answer = -1
if N == number:
return 1
d = [set() for i in range(9)]
for i in range(1, 9):
d[i].add(int(str(N) * i)) # [5, 55, 555, 5555...]
for i in range(2, 9):
for j in range(1, i):
# 예) 5자리 숫자를 만들기 위해서는
# 1+4, 2+3, 3+2, 4+1 네 개의 경우가 존재한다.
# [j] 와 [i-j] 의 합은 항상 5가 나온다.
for op1 in d[j]:
for op2 in d[i-j]:
d[i].add(op1 + op2)
d[i].add(op1 - op2)
d[i].add(op1 * op2)
if op2 != 0:
d[i].add(op1 // op2)
if number in d[i]:
answer = i
break
return answer
solution(5, 12)
この間,DP問題を解く際にnumberに対応するdpテーブルを作成し,1から値を充填し,既存値を用いてd[number]を求める.しかし、この問題はそんなことはできません.
N使用回数(1~8)に適合するDPテーブルを全て記憶することは考えにくい.思いもよらなかった.この問題はdpの原因であり[j]と[i−j]が既存値を利用する部分から確認できる.
Reference
この問題について([プログラマー]Nと表示), 我々は、より多くの情報をここで見つけました https://velog.io/@legowww/프로그래머스-N으로-표현テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol