Leetcode Java Ugly Number II
업데이트:
문제
코드
class Solution {
public int nthUglyNumber(int n) {
int[] nums = new int[n];
nums[0] = 1;
int index2 = 0;
int index3 = 0;
int index5 = 0;
int factor2 = 2;
int factor3 = 3;
int factor5 = 5;
int min = 1;
for (int idx = 1; idx < n; idx++) {
nums[idx] = min = Math.min(Math.min(factor2, factor3), factor5);
if (min == factor2) {
factor2 = nums[++index2] * 2;
}
if (min == factor3) {
factor3 = nums[++index3] * 3;
}
if (min == factor5) {
factor5 = nums[++index5] * 5;
}
}
return min;
}
}
결과
설명
- 지난 번 Ugly Number와 비슷한 문제로, n번째 못생긴 숫자를 반환하는 문제이다.
- 못생긴 숫자는 소인수가 2, 3, 5의 숫자로만 구성된 양의 정수이다.
- 예제를 참고하면, 첫 번째 못생긴 숫자는 1인 것을 알 수 있다.
- 문제 풀이에 필요한 변수를 정의한다.
- nums는 n번째 못생긴 숫자를 임시 저장하기 위한 배열로, n의 크기로 정의하고 예제를 참고하여 첫 값에 1을 넣어준다.
- index2, index3, index5는 각 소인수 별 횟수를 저장하는 정수이다.
- factor2, factor3, factor5는 각 소인수의 배수를 저장하는 정수이다.
- min은 n번째 못생긴 숫자를 임시 저장하기 위한 정수이다.
-
1부터 n 이전까지 반복하여 nums에 못생긴 숫자를 순서대로 넣어준다.
- nums[idx]와 min에 factor2, factor3, factor5 중 가장 작은 값을 넣어준다.
- 못생긴 숫자인 각 정수들을 순서대로 nums에 넣기 위한 방법이다.
- min의 값에 따라 아래를 수행한다.
- min이 factor2와 동일한 값이면, index2를 증가시키고 nums의 index2번째 값을 가져와 2를 곱한 값을 factor2에 넣어준다.
- min이 factor3과 동일한 값이면, index3를 증가시키고 nums의 index3번째 값을 가져와 3를 곱한 값을 factor3에 넣어준다.
- min이 factor5와 동일한 값이면, index5를 증가시키고 nums의 index5번째 값을 가져와 5를 곱한 값을 factor5에 넣어준다.
- 위 수행이 개별 검증인 이유는, 공배수인 값의 경우 index와 factor를 공통으로 증가시키기 위함이다.
- 반복이 완료되면 min의 값 혹은 nums[$n - 1$]의 값을 주어진 문제의 결과로 반환한다.
- 반복은 $n - 1$번까지 반복되므로, min의 값과 nums[$n - 1$]의 값은 동일하다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기