아래와 같이 정의된 ugly numbers 중 n번째 수를 리턴해야 합니다.
number 타입의 자연수 (n >= 1)
number 타입을 리턴해야 합니다.
ugly numbers를 배열에 저장했을 때, n번째 ugly number의 위치는 인덱스 n-1 입니다.
let result = uglyNumbers(1);
console.log(result); // --> 1
result = uglyNumbers(3);
console.log(result); // --> 3
단순히 처음부터 끝까지 모든 수에 대해서 나눗셈 연산을 하는 대신 다른 방법(O(N))을 탐구해 보세요.
나눗셈 연산을 매번 다시 할 필요가 없습니다. ugly number에 2, 3 또는 5를 곱한 수 역시 ugly number 입니다.
const uglyNumbers = function (n) {
const result =[1];
let idx2 = 0;
let idx3 = 0;
let idx5 = 0;
for(let i = 0; i < n; i++) {
let mulBy2 = result[idx2] * 2;
let mulBy3 = result[idx3] * 3;
let mulBy5 = result[idx5] * 5;
let nextNum = Math.min(mulBy2, mulBy3, mulBy5);
result.push(nextNum);
if(nextNum === mulBy2) idx2++;
if(nextNum === mulBy3) idx3++;
if(nextNum === mulBy5) idx5++;
}
return result[n-1];
}
mulBy2 = 2 * 3
&& mulBy3 = 3 * 2
가 되는 등 중복값이 나오는 경우가 있다Math.min(mulBy2, mulBy3, mulBy5) = 6
으로 나온다mulBy2
와 mulBy3
모두 최소값으로 간주한다idx2
와idx3
모두 +1씩 된다 6
이 2번 들어갈 일은 없드아