728x90
시간 제한 0.5초(추가 시간 없음), 메모리 제한 1024MB
# 조건
- 정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다.
- X가 3으로 나누어 떨어지면, 3으로 나눈다.
- X가 2로 나누어 떨어지면, 2로 나눈다.
- 1을 뺀다.
- 정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다.
- 연산을 사용하는 횟수의 최솟값을 출력하시오.
입력
- 첫째 줄에 1보다 크거나 같고, 10^18보다 작거나 같은 정수 N이 주어진다.
출력
- 첫째 줄에 연산을 하는 횟수의 최솟값을 출력한다.
# 접근 방법
- 기존의 1로 만들기 문제들과 같이 dp를 활용해주면 된다.
- 다만, 숫자의 범위가 상당히 크므로 모든 숫자를 반복하여 체크한다면 시간초과가 발생한다.
- 따라서, 방문 배열이 아닌 방문 딕셔너리를 활용하여, 이 숫자가 이전에 방문한 적이 있는지 체크해준다.
import sys
sys.stdin = open('input.txt')
input = sys.stdin.readline
from collections import deque
N = int(input())
q = deque()
q.append(N-1)
visited = dict()
visited[N] = 0
visited[N-1] = 1
if not N % 2:
q.append(N//2)
visited[N//2] = 1
if not N % 3:
q.append(N//3)
visited[N//3] = 1
while not 1 in visited:
val = q.popleft()
if not val - 1 in visited:
visited[val-1] = visited[val] + 1
q.append(val-1)
if not val % 2 and not val // 2 in visited:
visited[val//2] = visited[val] + 1
q.append(val//2)
if not val % 3 and not val // 3 in visited:
visited[val//3] = visited[val] + 1
q.append(val//3)
print(visited[1])
728x90
'ALGORITHM > DP(동적 계획법)' 카테고리의 다른 글
[백준 26093번] 파이썬 - 고양이 목에 리본 달기 (0) | 2023.07.21 |
---|---|
[백준 27971번] 파이썬 - 강아지는 많은 수록 좋다 (0) | 2023.07.14 |
[백준 20303번] 파이썬 - 할로윈의 양아치 (0) | 2023.06.22 |
[백준 2342번] 파이썬 - Dance Dance Revolution (0) | 2023.03.19 |
[백준 14002번] 파이썬 - 가장 긴 증가하는 부분수열 4 (0) | 2023.03.18 |