CT 예상문제 01

HyeJi9908·2022년 4월 4일
#1463 : 1로 만들기(-1, //2, //3의 방법. 그러나 x로 2의 배수가 나올지 3의 배수가 나올지 아무의 배수가 아닌수가 나올지 모르기에 3가지 경우에 모두 대비한 코드 작성)

# x=10일 때, -1의 경우 10-1=9, 또 9가 1이되는 최소횟수= (9가 1이되는  최소횟수) +1(10에서 1을 뺀 연산)
#          , 2로 나눠 질 때의 경우 10//2 = 5 , 또 5가 1이 되는 횟수 = (5가 1이되는 횟수) +1(10에서 2나눈 연산)


x=int(input())
dp=[0,0,1,1] # 인덱스 값(0,1,2,3)에 해당하는 1로 만들기 연산 횟수 (최소수) 미리 저장, 4부터는  그 횟수가 1을 넘어서 미리 저장x

for i in range(4,x+1):
    dp.append(dp[i-1]+1) # -1 해서 1로 만드는 경우
    if i%2==0 : # 2로 나눠질 경우
        dp[i] = min(dp[i],dp[i//2]+1) # -1로 1 만드는 경우 연산 횟수와 2로 나눠질때 1로 만드는 경우 중 더 작은 횟수 도출
    if i%3==0 :
        dp[i] = min(dp[i],dp[i//3]+1) 
print(dp[-1]) 

(https://www.acmicpc.net/problem/1463)

0개의 댓글