개발
home
1️⃣

[알고리즘] 백준 1463번 1로 만들기 python Dynamic Programming

Created
2022/07/10
Tags
Algorithm
Python
Dynamic Programming
2022-07-10 @이영훈

접근 방법

기본적인 Dynamic Programming (DP) 문제입니다. 채점 시간 제한이 짧은 점과 memoization이 가능한 점을 통해 DP 문제임을 생각할 수 있습니다.
문제 예시에 있는 10을 생각해보면, 10 → 9 → 3 → 1로 가는 하향식 접근보다는 1 → 3 → 9 → 10으로 가는 상향식 접근이 memoization이 쉽기 때문에 저는 문제를 상향식으로 접근해서 풀었습니다.
무한으로 초기화되어 있는 dp 리스트 변수는 index가 숫자이고 안에 있는 값은 최소 몇 번 만에 만들 수 있는지에 관한 값입니다.
예를 들어 dp[1] = 0은 숫자 1은 0번만에 만들 수 있다라는 의미이고 dp[10] = 3은 숫자 10은 3번만에 만들 수 있다라는 뜻입니다.
dp[num]의 숫자와 이번에 만들 수 있는 숫자 중 최소값을 dp[num]에 업데이트하는 방식으로 접근하였습니다.

파이썬 코드

import sys input = sys.stdin.readline target = int(input()) INF = int(1e8) dp = [INF] * (target + 1) dp[1] = 0 for num in range(1, target + 1): if num * 3 <= target: dp[num * 3] = min(dp[num * 3], dp[num] + 1) if num * 2 <= target: dp[num * 2] = min(dp[num * 2], dp[num] + 1) if num + 1 <= target: dp[num + 1] = min(dp[num + 1], dp[num] + 1) print(dp[target])
Python
복사

제출결과

같은 코드인데 PyPy3로 제출했을 때가 Python3로 제출했을 때보다 6배 넘게 빠르게 동작합니다