programmers.co.kr/learn/courses/30/lessons/42895
1. 문제 설명
아래와 같이 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 함수를 작성하세요.
2.제한사항
- N은 1 이상 9 이하입니다.
- number는 1 이상 32,000 이하입니다.
- 수식에는 괄호와 사칙연산만 가능하며 나누기 연산에서 나머지는 무시합니다.
- 최솟값이 8보다 크면 -1을 return 합니다.
3. 입출력 예
5 | 12 | 4 |
2 | 11 | 3 |
입출력 예 설명
예제 #1
문제에 나온 예와 같습니다.
예제 #2
11 = 22 / 2와 같이 2를 3번만 사용하여 표현할 수 있습니다.
4. 풀이
def solution(N, number):
#dp[i]는 N을 i번만 사용해서 나타낼 수 있는 수들의 집합이다.
#기본적으로 연산을 하지않을 때 당연히 생각할 수 있는 수들은 {N, NN, NNN, NNNN,... 같은 것들이 있다.
dp =[set([N*int('1'*i)]) for i in range(1, 9)]
"""
이제 이걸 바탕으로
k번 사용해서 나타낼 수 있는 수들의 집합은 아래와 같이 표현 할 수 있다.
{k번 집합} = {k-i번 집합} (사칙연산) {i번 집합}
즉 N을 k번 사용해서 나타낼 수 있는 집합은
N을 k-i번 사용해 나타낼 수 있는 수들과 i 번 사용해서 나타낼 수 있는 수의 사칙연산에 의해 나타낼 수 있다.
"""
for i in range(8): #N을 사용한 횟수
for j in range(i):
for num1 in dp[j]: #i 번 사용해서 나타낼 수 있는 수
for num2 in dp[i-j-1]: # N-i번 사용해서 나타낼 수 있는 수
# 사칙연산
dp[i].add(num1 + num2)
dp[i].add(num1 - num2)
dp[i].add(num1 * num2)
if num2 != 0:
dp[i].add(num1//num2)
#위 과정을 끝내면 N을 i번 사용해서 나타낼 수있는 수가 dp[i]에 저장된다.
# 만약 그 집합안에 'number'가 있으면
if number in dp[i]:
return i+1 # 정답 출력
return -1
'Algorithm > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 자물쇠와 열쇠 python (0) | 2021.04.26 |
---|---|
[프로그래머스] 후보키 python (0) | 2021.04.22 |
[프로그래머스] 파일명 정렬 python (0) | 2021.04.15 |
[프로그래머스] 삼각 달팽이 파이썬 (0) | 2021.04.13 |
[프로그래머스] 징검다리 파이썬 (0) | 2021.02.25 |