문제 내용
주어진 수가 4의 제곱으로 표현 가능한가?
접근 방법
주어진 수를 4로 나누어서 최종 값이 1이 되면 된다.
var isPowerOfFour = function(n) {
if(n < 0) return false;
while(1 < n) n /= 4;
return n=== 1? true : false;
};
별거 아닌것 같긴한데 2가지 방법으로 접근이 더 가능해서 글을 남기려고 한다.
수학적 접근 방법
$$ n = 4^x $$
로 표현 할 수 있다.
양쪽에 $ log_4 $ 를 해주면
$ log_4 n = log_4 4^x $
로 표현 할 수 있고 이것을 더 진행하면
$ log_4 n = x log_4 4 $
$ log_4 n = x $
$ log_2^2 n = x $
$ \frac{1}{2} log_2 n = x $
로 최종 표현이 가능하다.
x는 정확히 소숫점 없는 Integer가 되면 되는데 이것은
$ log_2 n = 2 * x $
로 표시할 수 있음으로 $ log_2 n $ 이 2로 modulation 된다면 정답이라고 볼 수 있다.
기본적으로 Math 함수에서 제공하는 log는 밑이 e가 됨으로
log 성질을 이용해서
$ log_2 n = \frac{log_e n}{log_e 2} $
로 나타낼 수 있다.
var isPowerOfFour = function(n) {
if(n <= 0) return false;
return (Math.log(n) / Math.log(2)) % 2 === 0 ? true : false;
};
이 부분을 조금더 쉽게 만들어 보면 다음과 같이 나타낼 수 있다.
$ log_4 n $은 1로 modulation 가능한가?
$ log_4 n = \frac{log_e n}{log_e 4}$ 로 변경이 가능하고 이것을 코드로 바꾸면 아래와 같이 만들 수 있습니다.
var isPowerOfFour = function(n) {
if(n <= 0) return false;
return getBaseLog(4, n) % 1 === 0 ? true : false;
};
function getBaseLog(x, y) {
return Math.log(y) / Math.log(x);
}
728x90
반응형
'Problem Solving' 카테고리의 다른 글
Javascript 32bit 이상 Number&Integer 계산하기 (BigInt) (1) | 2021.08.14 |
---|---|
Longest Repeating Character Replacement (0) | 2021.08.13 |
Data Stream as Disjoint Intervals (0) | 2021.08.10 |
Hamming Distance (0) | 2021.08.09 |
Different Ways to Add Parentheses (0) | 2021.08.03 |