코딩 테스트 연습 - N으로 표현 [DP]
코딩테스트 연습 - N으로 표현
programmers.co.kr
처음 문제를 보았을 때 DP보다는 BFS가 먼저 떠올라서 BFS로 한참을 시도하다가 처리해야 하는 경우가 너무 많아져서 DFS로 변경했네요.
풀이
1. DFS를 이용한 완전 탐색
DFS를 사용하면 하나의 단계에서 4가지 갈래가 나오게 됩니다.
그리고 완전 탐색을 진행하므로 일정한 크기의 트리구조를 순회하는 것과 같아져서 일정한 속도로 탐색할 수 있게 됩니다.
Code
from collections import deque
def dfs(base, target):
queue = deque([[0, 0]])
mins = -1
while queue:
curr, step = queue.pop()
if curr == target and (mins > step or mins == -1):
mins = step
elif step > 8:
continue
else:
for i in range(1, 9):
if step+i > 8: break
temp = int(str(base)*i) # 연속된 숫자 만들기
queue.append([curr + temp, step + i]) # +연산
queue.append([curr - temp, step + i]) # -연산
queue.append([curr * temp, step + i]) # *연산
queue.append([int(curr / temp), step + i]) # /연산
return mins
def solution(N, number):
return dfs(N, number)
문제 설명
아래와 같이 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 |
'Algorithm' 카테고리의 다른 글
[프로그래머스] 위클리 챌린지 9주차 - 전력망을 둘로 나누기 (Python) (0) | 2021.10.22 |
---|---|
[프로그래머스] 코딩테스트 연습 - 빛의 경로 사이클 (Python) (0) | 2021.09.19 |
[프로그래머스] 위클리 챌린지 5주차 - 모음사전 (Python) (0) | 2021.09.06 |
[프로그래머스] 코딩테스트 연습 - 베스트앨범 (Python) (0) | 2021.08.20 |
[프로그래머스] 위클리 챌린지 3주차 - 퍼즐 조각 채우기 (Python) (4) | 2021.08.18 |