상세 컨텐츠

본문 제목

[Python] 백준 1463번 - 1로 만들기

STUDY/__Coding Test

by 2_54 2022. 2. 4. 01:37

본문

문제 링크 :

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

 

1463번: 1로 만들기

첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.

www.acmicpc.net


문제

정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다.

  1. X가 3으로 나누어 떨어지면, 3으로 나눈다.
  2. X가 2로 나누어 떨어지면, 2로 나눈다.
  3. 1을 뺀다.

정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오.

입력

첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.

출력

첫째 줄에 연산을 하는 횟수의 최솟값을 출력한다.

예제 입력 : 

2

예제 출력 : 

1

코드

import sys
input = sys.stdin.readline

num = int(input())
dp = [0]*(num+1)

for i in range(2, num+1):
    dp[i] = dp[i-1] + 1
    if i % 3 == 0:
        dp[i] = min(dp[i], dp[i // 3]+1)
    if i % 2 == 0:
        dp[i] = min(dp[i], dp[i // 2]+1)

print(dp[num])

+ 기억해두기

/와 //의 차이
//은 나누고 난 후 뒤 소수점을 버린다!
/은 안버림


+TMI

 

나는 DP랑 안맞는 것 같다..
멍청함의 한계인가ㅠㅠㅠㅠㅠ흑

사실 고등학교때도 수열은 잘 못했다
이쪽도 머리가 다 있나보다 ㅠㅠ
이번에도 결국 다른 사람의 생각을 참고했다....

DP는 코드는 그 무엇보다 간단한데
이 방법을 생각해내는 게 어려운 것 같다.

나의 경우
우선 1을 빼고
3으로 나눠지는 경우와 2로 나눠지는 경우를 계산했다.

얘는 피보나치처럼 생각하면 되는 듯 하다.

다음 DP는 꼭 내 머리로만 풀고 싶다ㅠㅠ

반응형

관련글 더보기

댓글 영역