Write a program to find the n-th ugly number.
Ugly numbers are positive numbers whose prime factors only include 2, 3, 5.
Example:
Input: n = 10
Output: 12
Explanation: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 is the sequence of the first 10 ugly numbers.
Note:
- 1 is typically treated as an ugly number.
- n does not exceed 1690.
pow(2, a) * pow(3, b) * pow(5, c) = k λ₯Ό λ§μ‘±νλ n λ²μ§Έ k λ₯Ό μ°Ύλ λ¬Έμ λ€.
1μ© μ¦κ°νλ μ«μ num μ λμμΌλ‘ 2, 3, 5 μ μ‘°ν©μΌλ‘ λ§λ€ μ μλμ§ brute-force λ‘ νμμ§λ§, μμ λ‘ μ£Όμ΄μ§ 1690 μ μ λ ₯νμ κ²½μ° Time Limit μ΄ λ΄λ€. ννΈκ° κ½€ λ§μ΄ μλλ°λ μ΄λ €μ λ€.
λͺ¨λ μ‘°ν©μΌλ‘λ ꡬν μ μκ³ , dpλ‘ νμ΄μΌ νλ€. (λλ κ²°κ΅ λμ€μ»€μ μ λ΄€λ€.)
pow(2, a) * pow(3, b) * pow(5, c) = k λ₯Ό λ§μ‘±νλ μ΄λ€ k κ° μμ λ, a, b, c μ μ‘°ν©μ λ§λ€λ©° λλ€.
μ΄ a,b,c λ₯Ό λ°κΏκ°λ©΄μ μ«μ k λ₯Ό n λ² λ§νΌ λλ©΄μ ꡬνλ©΄ λλ€. a,b,c λ λ¨μν κ°μ λ³κ²½νλ κ²μ μλλ€. λ§μ½ (0, 1, 0) μμ (0, 0, 1) λ‘ λ°κΎΌλ€λ©΄ κ°κ° 3μμ 5κ° λλ€. μ¬μ€μ kκ° 4μΌ κ²½μ°μλ 2λ₯Ό μ΄μ©ν΄μ λ§λ€ μ μλλ° λ§μ΄λ€.
μ΄λ₯Ό μν΄ μμ μμμ λΆν° μ¦κ°νκ² μ‘°ν©μ λ§λ€μ΄ μ£Όμ΄μΌ νλ€. μμ μ λΆν° μ¦κ°νκ² λ§λλ λ²μ μκΈ° μμ κ³Ό μ΄μ μ ꡬνλ κ° μ€ μμ κ°μ μ ννλ©΄ λλ€. μ΄κ² λ λ§μΈκ° νλ©΄...
νμ¬ 3 μ΄λΌλ μκ° μλ€κ³ νμ λ, μ΄ λ€μ κ°μ 2μ 3κ³Ό 5 μ€μ μμ κ°μ μ ννλλ°, κ·Έλ₯ μ ννλ κ²μ΄ μλκ³ μ΄μ μ ꡬνλ k λͺ©λ‘ λ€μ μ΄μ©νλ κ²μ΄λ€. μλλ©΄ k κ°μ 2μ 3κ³Ό 5μ μ‘°ν©μΌλ‘ λ§λ€μ΄μ§ κ²μ΄κ³ k+1 μ μ΄μ μ k λ€(μ΄λ―Έ 2,3,5 λ‘ μ‘°ν©λ κ°) μμ 2,3,5λ‘ μ‘°ν©ν κ°μ΄κΈ° λλ¬Έμ΄λ€.
μλ₯Ό λ€λ©΄ k λ€μ 리μ€νΈλ‘ (n μ΄ 6κΉμ§ μΌ λ) [1,2,3,4,5,6] μλλ°, nμ΄ 7μΈ κ²½μ°μ 2,3,5 μ€ μ΄λ€ κ°κ³Ό [1,2,3,4,5,6] μ€ νλμ κ°μ κ³±ν κ²½μ°κ° λλ€λ μλ―Έλ€.
κ·Έλ¦¬κ³ μ€μ λ‘ n μ΄ 7μΌ λλ 2μ 4λ²μ§Έ κ° 4λ₯Ό κ³±ν 8μ΄ λλ κ²μ΄λ€.
μ¬κΈ°μ 2 λλ 3 λλ 5λ₯Ό μ ννλ κ²½μ° κ·Έλ¦¬κ³ λ¦¬μ€νΈμ i λ²μ§Έ κ°μ μ ννλ κ²½μ°λ₯Ό μ½λλ‘ κ΅¬ννλ©΄ λλ€. μ΄ λ΄μ©μ΄ λ°λ‘ μ½λμ
nums[i] = min(nums[p2] * 2, nums[p3] * 3, nums[p5] * 5)μ΄ λΆλΆμ΄λ€. numsλ μμμ κ³μ μΈκΈνλ k λͺ©λ‘μ΄κ³ , p2, p3, p5 λ μ΄μ k λͺ©λ‘μμ κ°κ° μν₯μ λΌμ³€λ(?) 2, 3, 5μ μΈλ±μ€λ‘ 보면 λλ€.
μ΄μ κ°λ€μ μ¬μ©νκΈ° λλ¬Έμ DP λ€.
p2, p3, p5 λ μ΅μ΄μ 0 μ΄κ³ μ΄ 0 μ numsμ μΈλ±μ€λ‘ λλ€. nums λ μ μΌ μ²μ κ°μ΄ 1μΈ λ¦¬μ€νΈμ΄λ€. (μ²μ κ°μ΄ 1μΈ μ΄μ λ 2,3,5 λ‘ λ§λ€ μ μλ κ°μ₯ μμ κ°μ΄ 1μμΌλ‘ μ΄λ―Έ μκ³ μκΈ° λλ¬Έμ΄λ€.)
μ΄ν 2, 3, 5λ κ°κ° 2 * nums[0], 3 * nums[0], 5 * nums[0] μ΄ λκ³ μ΄ μ€ κ°μ₯ μμ κ°μ λ°λ‘ 2λ€. κ·ΈλΌ μ΄ κ°μ nums[1] μ λ£λλ€. κ·Έλ¦¬κ³ 2λ 2 * nums[0] μΌλ‘ λ§λ€ μ μλ μ μ΄κΈ° λλ¬Έμ p2 λ₯Ό μ¦κ° μμΌμ€λ€. (κ·ΈλΌ p2λ 0 μμ 1μ΄ λλ€.)
nums = [1, 2, ...] 2 * nums[1], 3 * nums[0], 5 * nums[0] μ΄ λκ³ μ΄ μ€ κ°μ₯ μμ κ°μ λ°λ‘ 3μ΄λ€. 3μ nums[2] μ λ£λλ€. κ·Έλ¦¬κ³ 3λ 3 * nums[0] μΌλ‘ λ§λ€ μ μλ μ μ΄κΈ° λλ¬Έμ p3 λ₯Ό μ¦κ° μμΌμ€λ€.
nums = [1, 2, 3, ...] 2 * nums[1], 3 * nums[1], 5 * nums[0] μ΄ λκ³ μ΄ μ€ κ°μ₯ μμ κ°μ λ°λ‘ 4λ€. 4λ₯Ό nums[3] μ λ£λλ€. κ·Έλ¦¬κ³ 4λ 2 * nums[1] μΌλ‘ λ§λ€ μ μλ μ μ΄κΈ° λλ¬Έμ p2 λ₯Ό μ¦κ° μμΌμ€λ€.
μ΄λ°μμΌλ‘ 2,3,5μ ν΄λΉνλ μΈλ±μ€λ₯Ό λκ³ nums μ μ‘°ν©νμ¬ μμ κ° λΆν° μ¦κ°μν€λ©΄μ n λ²μ§Έ nums λ₯Ό ꡬνλ©΄ λλ€. μ½λλ‘ λ³΄λ©΄ μλμ κ°λ€.
class Solution:
def nthUglyNumber(self, n: int) -> int:
p2, p3, p5 = 0, 0, 0
nums = [1 for _ in range(n)]
for i in range(1, n):
nums[i] = min(nums[p2] * 2, nums[p3] * 3, nums[p5] * 5)
if nums[i] == nums[p2] * 2:
p2 += 1
if nums[i] == nums[p3] * 3:
p3 += 1
if nums[i] == nums[p5] * 5:
p5 += 1
return nums[-1]if-else κ° μλλΌ if λ¬ΈμΌλ‘ ν μ΄μ λ 6 κ³Ό κ°μ μλ 2 * 3, 3 * 2 λ‘ 2μ 3 κ°κ° μ°κ΄μ΄ μκΈ° λλ¬Έμ΄λ€.