N
과 number
가 주어졌을 때, N
과 사칙연산을 사용하여 number
를 만들 수 있는 경우의 수 중, 가장 작은 수를 출력하는 문제이며, N
이 8개 이상 사용된 경우 -1을 출력한다.
dp
문제 임을 알고 있었지만, 스스로 생각해내기 어려운 문제였다.
N
의 11배, 111배, 1111배 이런 식으로 생각하다가, 나누어 떨어지는 경우를 생각하다가.. 실패했다.
접근 방법은 다음과 같다.
N
이 8개 이상 사용되면 안되기 때문에,N
이 1개 일 때부터 8개일 때 까지의 경우를 고려
- 중복을 허용하지 않는
set()
을 활용해N
이 1개일 때 사칙연산, 2개일 때 사칙연산을
N
개 까지 진행
- 결국
dp
가[{5}, {55, 0(5-5), 1(5//5), 10(5+5), 25(5*5)}, {555, 2(10//5), 60(55+5), ...]
같이 모든 경우의 수를 고려
- 생성된 값들 중
number
가 도출된다면N
의 개수를 나타내는i
를 정답으로 출력
for
문으로 수행하여, 도출되자마자 출력하면 자연스럽게 최소값 도출
def solution(N, number):
answer = -1 # 기본값 -1 할당
dp = [] # dp 배열 선언
for i in range(1, 9): # N이 1부터 8까지
value_arr = set() # set으로 중복 값 삭제
value_arr.add(int(str(N) * i)) # N이 i개인 경우 추가
for j in range(0, i-1):
for op1 in dp[j]: # 사칙연산 과정 수행
for op2 in dp[-j-1]: # 1-5, 5-1은 다른 결과이므로
value_arr.add(op1 + op2)
value_arr.add(op1 - op2)
value_arr.add(op1 * op2)
if op2 != 0:
value_arr.add(op1//op2)
if number in value_arr: # 사칙연산을 수행했을 때, number가 있다면
answer = i # 사용된 N의 개수를 정답에 넣고 종료
break
dp.append(value_arr)
return answer