[C] LeetCode 264. Ugly Number IICoding/PS2026. 5. 3. 17:23
Table of Contents
반응형

문제

번역
ugly number는 소인수를 2,3,5만 갖고 있는 양수를 말한다.
정수 n이 주어졌을 때, n번째 ugly number를 반환해라.
접근 방법 및 소스 코드
처음엔 기존 ugly number를 구하는 코드를 그대로 활용하여 n번째 ugly number를 구했다.
int dp[1691];
bool isUgly(int n) {
while(n%2==0) n/=2;
while(n%3==0) n/=3;
while(n%5==0) n/=5;
return n==1;
}
int nthUglyNumber(int n) {
dp[0] = 0; dp[1]=1;
dp[2]=2; dp[3]=3; dp[4]=4;
int i=5,j=5;
while(i <= n) {
if(isUgly(j)) {
dp[i] = j;
i++;
}
j++;
}
return dp[n];
}
이렇게 작성하고 제출하니 timeout이 발생했다.
그래서 힌트를 참고하니 대부분의 수는 ugly number가 아니기에 ugly number를 만드는 방법을 생각해보라 했다.
ugly number는 소인수 2,3,5로만 이루어져 있다.
그럼 다음 ugly number는 기존 ugly number에서 2,3,5를 곱한 것 중 가장 작은 것일 것이다.
2,3,5를 곱할 이전 값 포인터를 3개를 만들어두고 각 포인터에 2,3,5를 곱해서 가장 작은 값을 쓰면 된다.
int dp[1691];
int min(int a, int b, int c) {
a = (a < b) ? a: b;
a = (a < c) ? a: c;
return a;
}
int nthUglyNumber(int n) {
dp[0] = 0; dp[1]=1;
int p2=1, p3=1, p5=1;
for(int i=2; i<=n;i++) {
dp[i] = min(dp[p2]*2, dp[p3]*3, dp[p5]*5);
if(dp[p2]*2 == dp[i]) p2++;
if(dp[p3]*3 == dp[i]) p3++;
if(dp[p5]*5 == dp[i]) p5++;
}
return dp[n];
}

꽤나 괜찮은 결과가 나왔다.
반응형
'Coding > PS' 카테고리의 다른 글
| [C] LeetCode 1353. Maximum Number of Events That Can Be Attended (0) | 2026.05.07 |
|---|---|
| [C] LeetCode 215. Kth Largest Element in an Array (0) | 2026.05.07 |
| [C] LeetCode 1823. Find the Winner of the Circular Game (0) | 2026.04.19 |
| [C] LeetCode 1863. Sum of All Subset XOR Totals (0) | 2026.04.19 |
| [C] LeetCode 42. Trapping Rain Water (0) | 2026.04.18 |
@현주씌 :: 현주.로그
소프트웨어학과 현주씌의 일상을 담는 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!