정답은 내가 했던 생각의 2-3에서 출발한다.
N을 i번 써서 number을 표현할 수 있는 수들은
N을 각각 (1번, i-1번), (2번, i-2번), ... (j번, i-j번) 써서 표현할 수 있는 수들을
교차해서 사칙연산한 결과 + N{i} 이다.
N=5라고 할 때,
1: 5
2: 55, 5+5, 5-5, 55, 5/5
3: 555, 55+5, 55-5, 555, 55/5, 5+5+5, 5+5-5, 5-5-5, 5*5-5, 5/5-5...
i=3 의 경우의 수는 i=1에 있는 것들과 i=2에 있는 것들을 교차해서 사칙연산한 집합이다.
내가 생각을 2-3에서 시작해서
dp 배열에 항상 '숫자 하나'만 들어가는 게 아닌 경우의 수, 집합 등 다양한 자료값이 들어갈 수 있다고 생각했더라면 풀 수 있는 문제였다.
이 문제로 dp를 좀 더 다양하게 풀 수 있게 되었다.
def solution(N, number):
dp = [set() for _ in range(9)]
for i in range(1, 9):
dp[i].add(int(str(N) * i))
for j in range(1, i):
for x in dp[i - j]:
for y in dp[j]:
add_num(dp[i], x + y)
add_num(dp[i], x - y)
add_num(dp[i], x * y)
add_num(dp[i], x // y)
if number in dp[i]:
return i
return -1
def add_num(d, x):
if x != 0:
d.add(x)
add_num(d, x)
함수는 어차피 dp[i]에 들어갈 값이 0이면 넣어줄 필요가 없으므로 이에 대한 예외처리를 하도록 따로 뺀 함수이다.