728x90
먼저 n이란 수가 억억단에서 나오는 횟수는 n의 약수의 개수이다.
따라서 처음에는 n의 약수 개수를 구하는 알고리즘을 활용해서 해결해보려고 했다.
const getDivisorCnt = (n) => {
let ret = 0;
for (let i = 0; i <= n ** 0.5; i++) {
if (!(n % i)) ret += 1;
}
ret *= 2;
if (Number.isInteger(n ** 0.5)) ret -= 1;
return ret;
};
function solution(e, starts) {
const ret = starts.map((n) => {
let cnt = getDivisorCnt(n);
let ret = n;
for (let i = n; i <= e; i++) {
const tmp = getDivisorCnt(i);
if (tmp > cnt) {
cnt = tmp;
ret = i;
}
}
return ret;
});
return ret;
}
하지만 문제 케이스가 5,000,000 까지로 매우 크기때문에 위와같이 일일히 구하는건 어려웠다.
따라서 시간을 줄일 수 있는 2가지 방법을 생각해봤다.
1. 에라토스테네스의 체를 활용해서 1~5,000,000 까지의 약수의 개수를 모두 구한다.
2. dp를 활용해서 e~1까지의 최대 약수 개수를 가진 수를 저장한다.
=> 이 경우 역순으로 dp를 채워나가야 한다. 문제에서 e는 약수의 범위를 찾는 구간중 큰 구간으로 고정되어 있기 때문에 해당 부분부터 역순으로 찾아나가면 된다. 또한, 약수의 개수가 작은 경우에는 더 작은수가 정답이 된다는 것을 생각하자.
function solution(e, starts) {
const sieve = new Array(5000001).fill(0);
for (let i = 1; i <= e; i++) {
for (let j = 1; j <= e / i; j++) {
sieve[i * j]++;
}
}
const ret = [e];
for (let i = e - 1; i > 0; i--) {
ret.push(sieve[ret[ret.length - 1]] > sieve[i] ? ret[ret.length - 1] : i);
}
return starts.map((n) => ret[e - n]);
}
728x90
'FrontEnd > 프로그래머스' 카테고리의 다른 글
[JS,Python] 등대 (1) | 2023.10.20 |
---|---|
[JS] 숫자 타자 대회 (1) | 2023.10.19 |
[JS] 미로 탈출 명령어 (0) | 2023.10.17 |
[JS] 표 병합 (1) | 2023.10.16 |
[JS] 표현 가능한 이진트리 (0) | 2023.10.14 |