Skip to content

Latest commit

Β 

History

History
98 lines (65 loc) Β· 4.45 KB

File metadata and controls

98 lines (65 loc) Β· 4.45 KB

문제

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μž„μœΌλ‘œ 이미 μ•Œκ³  있기 λ•Œλ¬Έμ΄λ‹€.)

(1)

이후 2, 3, 5λŠ” 각각 2 * nums[0], 3 * nums[0], 5 * nums[0] 이 되고 이 쀑 κ°€μž₯ μž‘μ€ 값은 λ°”λ‘œ 2λ‹€. 그럼 이 값을 nums[1] 에 λ„£λŠ”λ‹€. 그리고 2λŠ” 2 * nums[0] 으둜 λ§Œλ“€ 수 μžˆλŠ” 수 이기 λ•Œλ¬Έμ— p2 λ₯Ό 증가 μ‹œμΌœμ€€λ‹€. (그럼 p2λŠ” 0 μ—μ„œ 1이 λœλ‹€.)

(2)

nums = [1, 2, ...] 2 * nums[1], 3 * nums[0], 5 * nums[0] 이 되고 이 쀑 κ°€μž₯ μž‘μ€ 값은 λ°”λ‘œ 3이닀. 3을 nums[2] 에 λ„£λŠ”λ‹€. 그리고 3λŠ” 3 * nums[0] 으둜 λ§Œλ“€ 수 μžˆλŠ” 수 이기 λ•Œλ¬Έμ— p3 λ₯Ό 증가 μ‹œμΌœμ€€λ‹€.

(3)

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 각각 연관이 있기 λ•Œλ¬Έμ΄λ‹€.