이해하는데 꽤 애먹은 문제였다. 풀이 자체는 굉장히 간단하다. 못생긴 수에 2,3,5 중 하나를 곱해준 결과는 항상 못생긴 수라는 것이다. 바꿔 말하면, 1부터 시작해서 2,3,5를 각각 곱해가며 못생긴 수를 만들고, 오름차순으로 나열해야 하니 후보 숫자들 중 최소값을 못생긴 수 배열 끝에 담아주는 것이다.
next가 의미하는 것은, 모든 못생긴 수에 대해 2,3,5를 각각 곱해본다는 의미이다.
코드
n = int(input())
ugly = [0]*n
ugly[0] = 1
i2 = i3 = i5 = 0
next2,next3,next5 = 2,3,5
for l in range(1,n):
ugly[l] = min(next2,next3,next5)
if ugly[l] == next2:
i2 += 1
next2 = ugly[i2]*2
if ugly[l] == next3:
i3 += 1
next3 = ugly[i3]*3
if ugly[l] == next5:
i5 += 1
next5 = ugly[i5]*3
print(ugly[n-1])
'PS > 이것이 취업을 위한 코딩 테스트다 with 파이썬' 카테고리의 다른 글
모험가 길드 - 그리디 (0) | 2022.07.27 |
---|---|
편집 거리 - DP (0) | 2022.07.25 |
금광 - DP (0) | 2022.07.23 |
다이나믹 프로그래밍 (0) | 2022.07.08 |
이진 탐색 (0) | 2022.07.07 |