문제
https://school.programmers.co.kr/learn/courses/30/lessons/42895
문제 설명
아래와 같이 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 하도록 solution 함수를 작성하세요.
제한 사항
- N은 1 이상 9 이하입니다.
- number는 1 이상 32,000 이하입니다.
- 수식에는 괄호와 사칙연산만 가능하며 나누기 연산에서 나머지는 무시합니다.
- 최솟값이 8보다 크면 -1을 return 합니다.
입출력 예
N | number | return |
5 | 12 | 4 |
2 | 11 | 3 |
입출력 예 설명
예제 #1
문제에 나온 예와 같습니다.
예제 #2
11 = 22 / 2와 같이 2를 3번만 사용하여 표현할 수 있습니다.
문제 풀이
저는 이 문제를 동적계획법(Dynamic Programming) 알고리즘을 사용해서 풀었습니다.
2022.07.22 - [알고리즘/개념] - [파이썬으로 배우는 알고리즘] 동적 계획법(Dynamic Programming)
N이 5라고 가정하고, 문제를 풀어보겠습니다.
1) N을 1 개 사용해서 나타낼 수 있는 수들을 구한다.
5
2) N을 2 개 사용해서 나타낼 수 있는 수들을 구한다.
55, 10(5 + 5), 0(5 - 5), 1(5 / 5), 25(5 * 5)
3) N을 3 개 사용해서 나타낼 수 있는 수들을 구한다.
555, 15(5 + 5 + 5), 5(5 + 5 - 5), 6(5 + 5 / 5), 31(5 + 5 * 5),....
여기서 무슨 규칙이 보이거나 생각나지 않나요?
바로 N을 3개 사용해서 나타낼 수 있는 수는
(N을 1개 사용해서 나타낼 수 있는 수) 연산 (N을 2개 사용해서 나타낼 수 있는 수),
(N을 2개 사용해서 나타낼 수 있는 수) 연산 (N을 1개 사용해서 나타낼 수 있는 수)
로 나타낼 수 있다는 것입니다.
따라서 N을 n개 사용해서 나타낼 수 있는 수는
(N을 k개 사용해서 나타낼 수 있는 수) 연산 (N을 n-k개 사용해서 나타낼 수 있는 수) (1 <= k < n)
로 나타낼 수 있습니다.
구현
코드
def solution(N, number):
dp = [set([int(str(N)*i)]) for i in range(1, 9)]
# N 사용 횟수
for i in range(8):
for j in range(i):
# j 개
for num1 in dp[j]:
# i-j 개
for num2 in dp[i-j-1]:
dp[i].add(num1 + num2)
dp[i].add(num1 - num2)
dp[i].add(num1 * num2)
if num2 != 0:
dp[i].add(num1//num2)
# number가 연산한 결과에 있으면 답으로 반환
if number in dp[i]:
return i+1
return -1
결과
'PS > 프로그래머스' 카테고리의 다른 글
[프로그래머스(Programmers)/ Level2] N개의 최소공배수 (파이썬, Python3) (0) | 2022.07.01 |
---|---|
[프로그래머스(Programmers)/ Level3] 블록 이동하기 (파이썬, Python3) (0) | 2022.06.30 |
[프로그래머스(Programmers)/ Level2] 기능개발 (파이썬, Python3) (0) | 2022.06.30 |
[프로그래머스(Programmers)/ Level2] 구명보트 (파이썬, Python3) (0) | 2022.06.29 |