2022. 4. 12. 17:15ㆍ알고리즘/커뮤러닝
문제 설명
아래와 같이 5와 사칙연산만으로 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과 사칙연산만 사용해서 표현 할 수 있는 방법 중 N 사용횟수의 최솟값을 return
제한사항
- N은 1 이상 9 이하입니다.
- number는 1 이상 32,000 이하입니다.
- 수식에는 괄호와 사칙연산만 가능하며 나누기 연산에서 나머지는 무시합니다.
- 최솟값이 8보다 크면 -1을 return 합니다.
DP로 푸는건 알았는데....................어려워 못풀었다
Dynamic Programming (동적계획법)
: 주어진 최적화 문제를 재귀적인 방식으로 부분문제로 만들어 부분문제를 풀고 해를 조합해 전체 문제의 해답에 이르는 방식
알고리즘 진행에 따라 탐색해야할 범위를 동적으로 결정 > 탐색범위를 한정시킴
✔ 동적계획법으로 설계
N을 한번 사용해서 만들수 있는 수
N을 두번 사용해서 만들 수 있는 수
...
N=5 일 경우
사용한 횟수
1 : 5
2 : 55
& 1 (+, -, *, /) 1 -> 5 + 5, 5 - 5, 5 * 5, 5 / 5 = 10, 0, 25, 1
3 : 555
& 1 ( + - * / ) 2 & 2 ( + - * / ) 1 = 60, 15, 5, 30, 6, -50, -5, -20, 4, 275, 50, 0, 125, 11, 2, 20, -4, 555 => 19가지
4: 5555
& 1 ( + - * / ) 3 & 3 ( + - * / ) 1 & 2 ( + - * / ) 2
5 : 5555
& 1 ( + - * / ) 4 & 2 ( + - * / ) 3 & 3 ( + - * / ) 2 & 4 ( + - * / ) 1
따라서,
N = x 일 때
n : "x" * n + 1 [ + - * / ] (n-1) + 2 [ + - * / ] (n-2) + ... (n-1) [ + - * / ] 1
수식에 괄호 있어도 상관이 없다.
def solution(N, number):
s = [set() for x in range(8)] # 중복 허용하지 않는 set 사용, N은 9 이하이기 때문에 최대 8까지의 계산 결과만 저장하면 됨
for i, x in enumertate(s, start = 1):
x.add(int(str(N) * i))
for i in range(len(s)):
for j in range(i):
for op1 in s[j]:
for op2 in s[i - j - 1]:
# + - * / 한 결과 집합 생성
s[i].add(op1 + op2)
s[i].add(op1 - op2)
s[i].add(op1 * op2)
if op2 != 0: # 0이 아닐경우에만 나누기
s[i].add(op1 // op2)
if number in s[i]: # 원하는 숫자가 숫자를 i번 사용한 집합에 있으면
answer = i + 1
break
else: # Loop가 다 돌고도 없는 경우 -1 리턴
answer = -1
return number
어렵다
손코딩 꼭해봐야지
'알고리즘 > 커뮤러닝' 카테고리의 다른 글
[Python] 03-03 여행경로 (0) | 2022.04.11 |
---|---|
03-01 더 맵게_Heap (0) | 2022.04.11 |
02 체육복 - Greedy (0) | 2022.03.30 |
04 큰 수 만들기 - 탐욕법 (Greedy) (0) | 2022.03.29 |
03 가장 큰 수 - 풀이 (0) | 2022.03.29 |