728x90

문제
정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다.
- X가 3으로 나누어 떨어지면, 3으로 나눈다.
- X가 2로 나누어 떨어지면, 2로 나눈다.
- 1을 뺀다.
정수 N이 주어졌을 때,
위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다.
연산을 사용하는 횟수의 최솟값을 출력하시오.
입력
첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.
출력
첫째 줄에 연산을 하는 횟수의 최솟값을 출력한다.
문제해설
이번 문제는 DP의 가장 기본적인 형태의 문제였다.
1로 만드는 경우는 총 세가지 존재한다.
3으로 나누거나, 2로 나누거나, 1을 빼거나
이 문제를 해결하는 가장 중요한 키포인트는
dp를 입력 n의 숫자만큼 만든 뒤,
각 숫자를 만드는 데에 걸리는 최소의 연산 횟수를 계산하는 것이다.
Top-Down 방식으로 진행이 되는데,
모든 경우를 계산하고, 그 때의 최솟값을 찾아준다.
최소값을 계산하는 과정에서 DP 배열을 업데이트 해주고,
그 때 값으로 계속 계산해주면 된다.
DP 배열을 LIST가 아니라 DICT로 선언해주고,
문제를 풀었다.
그 외에 다른 모든 것은 DP 문제와 동일하다.
정답코드
n = int(input())
dp = {1: 0}
def memo(cur):
if cur in dp.keys():
return dp[cur]
if (cur % 3 == 0) and (cur % 2 == 0):
dp[cur] = min(memo(cur//2)+1, memo(cur//3)+1)
elif (cur % 3 == 0):
dp[cur] = min(memo(cur//3)+1, memo(cur-1)+1)
elif (cur % 2 == 0):
dp[cur] = min(memo(cur//2)+1, memo(cur-1)+1)
else:
dp[cur] = memo(cur-1)+1
return dp[cur]
print(memo(n))
728x90
'CodingTest > BOJ' 카테고리의 다른 글
[Python] 백준 1748 수이어쓰기 (0) | 2024.12.28 |
---|---|
[Python] 백준 12865 평범한 배낭 문제풀이 및 정답코드 (0) | 2024.12.23 |
[Python] 백준 1149 RGP거리 문제풀이 및 정답코드 (0) | 2024.12.16 |
10828 백준 스택 - 파이썬 (1) | 2024.12.11 |
백준 1550 16진수 - Python (0) | 2024.12.09 |