5를 2번 사용할 때 => 1번과 1번을 활용하여 사칙연산 => {55, (5+5), (5*5), (5/5), (5-5)}
5를 3번 사용할 때 => 1번과 2번을 활용하여 사칙연산 => {555, 5+(5+5), 5*(5+5), 5/(5+5), 5-(5+5), 5+(5*5), 5*(5*5), 5/(5*5), 5-(5*5), 5+(5/5), 5*(5/5), 5/(5/5), 5-(5/5), .....}
5를 4번 사용할 때=> 1번과 3번, 또는 2번과 2번을 활용하여 사칙연산
.
.
.
이런식으로 이전에 저장해두었던 dp[i]값을 활용하여 n을 i번 사용할 때의 횟수를 구할 수 있다.
이런식으로 n을 사용하는 횟수를 늘려갈 때마다 number값이 집합안에 있는지 확인하고 있으면 return값으로 dp[i]의 i를 반환한다.
💻 Code
def solution(N, number):
dp = [set() for i in range(9)]
for i in range(1, 9):
dp[i].add(int(str(N)*i))
for j in range(i//2 + 1):
for first in dp[j]:
for second in dp[i-j]:
dp[i].add(first + second)
dp[i].add(first - second)
dp[i].add(second - first)
dp[i].add(first * second)
if second != 0 :
dp[i].add(first // second)
if first != 0 :
dp[i].add(second // first)
if number in dp[i]:
return i
return -1
1. 먼저 dp[]에 N(1~8)사용횟수에 따라 저장할 수 있는 집합 set을 만든다. (set을 사용하는 이유는 중복을 제거하고 , in 탐색에 있어 효율적이기 때문) 2. 다음 각각의 횟수만큼 이어진 문자열을 집합에 넣는다. - {5}, {55}, {555}, ... 3. 예를 들어 i가 5라면 5가 되는 수 (1,4), (2,3)을 찾기 위해 for문으로 first, second값을 찾는다. 4. 찾은 뒤 first와 second값을 가지고 사칙연산을 수행한다. 5. 만약 집합 안에 number 값이 존재한다면 i가 n을 사용한 횟수이므로 i 값을 반환. 6. 8보다 크면 -1반환