1463. 1로 만들기
https://www.acmicpc.net/problem/1463
1463번: 1로 만들기
첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.
www.acmicpc.net
내 풀이 - 성공
N = int(input())
if N == 1:
print(0)
elif N == 2 or N == 3:
print(1)
else:
dp = [0]*(N+1)
dp[2], dp[3] = 1, 1
for n in range(4, N+1):
tmp = n
if n % 3 == 0:
tmp = min(tmp, dp[n//3]+1)
if n % 2 == 0:
tmp = min(tmp, dp[n//2]+1)
tmp = min(tmp, dp[n-1]+1)
dp[n] = tmp
print(dp[n])
dp 를 이용해서 1 ~ N 까지의 숫자들의 최소 연산값을 저장
3 으로 나눠 떨어지는 경우, 2 로 나눠 떨어지는 경우, 1 만 뺐을 경우
세가지를 모두 비교해서 최솟값으로 dp 값 설정
어떤 숫자든지 자기 자신보다 작은 숫자들의 dp 값은 이미 구해져있다는 점을 이용
참고) 처음엔 재귀로 3, 2, 1 세가지 경우를 모두 계산해서 최솟값을 찾았더니 시간 초과가 났다...
'알고리즘 > 백준' 카테고리의 다른 글
[백준 - SILVER 2] 1541. 잃어버린 괄호 - Python3 (0) | 2021.10.06 |
---|---|
[백준 - SILVER 4] 1920. 수 찾기 - Python3 (0) | 2021.10.06 |
[백준 - SILVER 3] 1874. 스택 수열 - Python3 (0) | 2021.10.03 |
[백준 - SILVER 1] 1389. 케빈 베이컨의 6단계 법칙 - Python3 (0) | 2021.10.02 |
[백준 - SILVER 3] 1654. 랜선 자르기 - Python3 (0) | 2021.10.02 |
댓글