못생긴 수란, 소인수분해 했을 경우 나오는 소인수가 2, 3 그리고 5뿐인 수를 이야기 하며, 이를 수열로 늘어놓으면 다음과 같다.
1, 2, 3, 4, 5, 6, 8, 9, 10, 12...
이는 처음나오는 10개의 못생긴 수이며, 편의상 1을 포함하도록 하자.
정수 n
이 주어졌을 때, n
번째 못생긴 수를 출력하는 프로그램을 작성하라.
입력조건
n
(n≤1,500)이 주어진다. 입력에 0 이 주어질 때까지 계속 한다.출력조건
n
번째 못생긴 수를 출력한다.
n = int(input())
ugly = [0] * n #못생긴 수를 담기 위한 테이블
ugly[0] = 1 #첫번째 못생긴 수는 1
#2배, 3배, 5배를 위한 인덱스
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
print('i2: ', i2)
print('next2:', next2)
print(ugly)
if ugly[l] == next3:
i3 += 1
next3 = ugly[i3] * 3
print('i3: ', i3)
print('next3:', next3)
print(ugly)
if ugly[l] == next5:
i5 += 1
next5 = ugly[i5] * 5
print('i5: ', i5)
print('next5:', next5)
print(ugly)
#n번째 못생긴 수 출력
print(ugly[n - 1])
print(ugly)
#include <bits/stdc++.h>
using namespace std;
int n;
int ugly[1000]; // 못생긴 수를 담기 위한 테이블 (1차원 DP 테이블)
int main(void) {
cin >> n;
// 2배, 3배, 5배를 위한 인덱스
int i2 = 0, i3 = 0, i5 = 0;
// 처음에 곱셈 값을 초기화
int next2 = 2, next3 = 3, next5 = 5;
ugly[0] = 1; // 첫 번째 못생긴 수는 1
// 1부터 n까지의 못생긴 수들을 찾기
for (int l = 1; l < n; l++) {
// 가능한 곱셈 결과 중에서 가장 작은 수를 선택
ugly[l] = min(next2, min(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] * 5;
}
}
// n번째 못생긴 수를 출력
cout << ugly[n - 1] << '\n';
}