728x90
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=5라면, 다음의 방법들이 가능하다.
N 사용 횟수 (cnt) | 1 | 2 | 3 | ... |
표현할 수 있는 방법 | 5 | 55, 5+5, 5-5, 5*5, 5//5 | 555, 5+(5+5), 5-(5-5), (5-5)-5, 5*(5*5), 5//(5//5), (5//5)//5 | ... |
이 때, N을 cnt번 사용해서 표현할 수 있는 방법들은 N을 cnt번 이어 붙인 숫자들과, 0~(cnt // 2 + 1) 중 하나를 i라고 했을 때 i번째 N의 사용으로 표현할 수 있는 방법들과, (cnt - i) 번째 N의 사용으로 표현할 수 있는 방법들을 사칙연산으로 계산한 결과들을 모은 것이다.
N을 cnt번 사용해서 표현할 수 있는 방법들 중 number가 있다면 현재의 N의 개수를 반환한다.
cnt의 최솟값은 8보다 클 수 없으므로 1~8까지의 cnt번 N이 사용된 결과물들 중 number가 없다면 -1을 반환한다.
<< 최종 코드 >>
def solution(N, number):
dp = [set() for _ in range(9)]
for cnt in range(1, 9):
dp[cnt].add(int(str(N) * cnt))
for i in range(cnt//2 + 1):
for left in dp[i]:
for right in dp[cnt-i]:
dp[cnt].add(left + right)
dp[cnt].add(left - right)
dp[cnt].add(right - left)
dp[cnt].add(left * right)
if right != 0:
dp[cnt].add(left // right)
if left != 0:
dp[cnt].add(right // left)
if number in dp[cnt]:
return cnt
return -1
728x90
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스 Level3] 매칭 점수 - 파이썬(Python) - 2019 KAKAO BLIND RECRUITMENT (0) | 2023.01.16 |
---|---|
[프로그래머스 Level3] 양과 늑대 - 파이썬(Python) - 2022 KAKAO BLIND RECRUITMENT (0) | 2023.01.12 |
[프로그래머스 Level3] 공 이동 시뮬레이션 - 파이썬(Python) - 월간 코드 챌린지 시즌3 (1) | 2023.01.11 |
[프로그래머스 Level2] 빛의 경로 사이클 - 파이썬(Python) - 월간 코드 챌린지 시즌3 (0) | 2023.01.11 |
[프로그래머스 Level2] 조이스틱 - 파이썬(Python) (0) | 2023.01.10 |