알고리즘/이코테 실전문제

[다이나믹 프로그래밍] 이코테 (파이썬) 1로 만들기 풀이

개발윗미 2021. 8. 30. 13:43

[문제]

정수 X가 주어졌을 때, 정수 X에 사용할 수 있는 연산은 다음과 같이 4가지입니다.

 

1. X가 5로 나누어 떨어지면, 5로 나눕니다.

2. X가 3으로 나누어 떨어지면, 3으로 나눕니다.

3. X가 2로 나누어 떨어지면, 2로 나눕니다.

4. X에서 1을 뺍니다.

 

정수 X가 주어졌을 때, 연산 4개를 적절히 사용해서 값을 1로 만들고자 합니다. 연산을 사용하는 횟수의 최솟값을 출력하세요.

 

예를 들어 정수가 26이면 다음과 같이 계산해서 3번의 연산이 최솟값입니다.

 

26 -> 25 -> 5 -> 1

 

[입력 조건]

1. 첫째 줄에 정수 X가 주어집니다. (1 <= X <= 30,000)

 

[출력 조건]

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

<입력 예시>
26
<출력 예시>
3

 

[풀이]

x = int(input())

d = [0] * 30001

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

  if i % 3 == 0 :
    d[i] = min(d[i], d[i // 3] + 1)

  if i % 5 == 0 :
    d[i] = min(d[i], d[i // 5] + 1)

print(d[x])

 

우선 정수 x를 입력받고 앞서 계산된 결과를 저장하기 위한 다이나믹 프로그래밍 테이블(d)을 초기화해준다.

 

그 후 반복문을 통해 다이나믹 프로그래밍을 수행하는데, 현재의 수에서 1을 빼는 경우와 현재의 수가 2로 나누어 떨어지는 경우,

 

현재의 수가 3으로 나누어 떨어지는 경우, 현재의 수가 5로 나누어 떨어지는 경우에 대하여 처리해준다.

 


출처

이것이 코딩 테스트다 with 파이썬 - 나동빈 저