Algorithm/Dynamic Programming

[Python] 못생긴 수

코딩쪼앙 2023. 2. 8. 15:48

문제

  • 못생긴 수란 오직 2, 3, 5 만을 소인수로 가지는 수를 의미한다.
  • 다시 말해 오직 2, 3, 5를 약수로 가지는 합성수를 의미한다.
  • 1은 못생긴 수라고 가정한다.
  • 따라서 못생긴 수들은 {1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, ... } 순으로 이어지게 된다.
  • 이 때, n번째 못생긴 수를 찾는 프로그램을 작성해라.
  • 예를 들어 11번째 못생긴 수는 10이다.

입력

  • 첫째 줄에 n이 입력된다.(1 <= n <= 1,000)

출력

  • n번째 못생긴 수를 출력한다.

입력 예제

11

출력 예제

15

문제 풀이

  • 가장 작은 못생긴 수에 차례대로 2, 3, 5를 곱하면 다음 못생긴 수를 구할 수 있다.
  • 따라서 각각 2, 3, 5를 곱한 인덱스와 2, 3, 5를 곱한 값을 변수에 저장 한 후, 연산한다.

코드

n = int(input())
ugly = [1] * n
# 첫번째 못생긴 수는 1
ugly[0] = 1

# 각각 다음 2,3,5를 곱할 인덱스
i2, i3, i5 = 0, 0, 0
# 2,3,5를 곱한 다음 못생긴 수
next2, next3, next5 = 2, 3, 5

for i in range(1, n):
    ugly[i] = min(next2, next3, next5)
    # 2를 곱한 값이라면, 2곱한 인덱스 값 카운트 후, 2를 곱한 다음 값 저장
    if ugly[i] == next2:
        i2 += 1
        next2 = ugly[i2] * 2
    # 3울 곱한 값이라면, 3곱한 인덱스 값 카운트 후, 3을 곱한 다음 값 저장
    if ugly[i] == next3:
        i3 += 1
        next3 = ugly[i3] * 3

    # 5를 곱한 값이라면, 5곱한 인덱스 값 카운트 후, 5를 곱한 다음 값 저장
    if ugly[i] == next5:
        i5 += 1
        next5 = ugly[i5] * 5

print(ugly[n - 1])

'Algorithm > Dynamic Programming' 카테고리의 다른 글

[Python] 편집거리  (0) 2023.02.09
[Python] 퇴사  (0) 2023.02.08
[Python] 병사 배치하기  (0) 2023.02.08
[Python] 효율적인 화폐 구성  (0) 2023.02.08
[Python] 바닥공사  (0) 2023.02.08