##필자 본인이 이해하기 어려운거 복습하려고 적은거라 뒤죽박죽 일수도있다.
number
타입의 정수 (num
>=1)boolean
타입을 리턴한다.입출력 예시 -
let output1 = powerOfTwo(16);
console.log(output1); // true
let output2 = powerOfTwo(22);
console.log(output2); // false
1.function powerOfTwo(num) {
2. while(num !== 1){
3. if(num % 2 !== 0){
4. return false;
5. }
6. num = num / 2
7. }
8. return true;
9.}
위의 코드말고도 여러가지방법이있다.
위의 코드에 대해 설명해본다.
우선 2의 거듭제곱 여부를 확인 하려면 여러가지 방법중 하나인 2로 반복해서 나누었을때 마지막에 1이 나올경우 2의 거듭제곱이라 할수있다.
그러므로 while문
을 써서 while(num !== 1)->(num가 1이 될때까지 반복한다고 볼수있다)
반복문안에서 num
가 1이아닌동안 반복해주다가 1이 될때 while문
바깥에 return true
로 반환해주는걸 생각하였다.
주의사항에 1은 2의 0승이므로 1은 true
이다 위의 while문
의 조건식 num
에 1을 넣는다면 바로 while문
바깥에 있는 return true
로 반환된다.
이어서 num
에 2를 넣으면 조건(num !== 1)
에 부합하여 while문
안에 조건문(if)
으로 들어가게 된다.
조건문(if(num % 2 !== 0))
에서 여기서 num % 2
는 num
를 2로 나누었을때 나머지가 결과값으로 나오므로 2로 나누었을때 0이아니라 나머지가 있으면 2의 거듭제곱은 무조건 아니라는걸 알수있다.
2의 거듭제곱이 아닌 num
를 false
로 리턴 시켜준다. if문
에 맞다면 num
는 return false
로 반환!
if문
에서 num
가 나누어 떨어져서 나머지가 0이라면 if문
에 부합하지 않으므로 while문
중괄호 안에 밑에서 반복 시켜줄 num = num / 2
를 써주고 나머지가 0이었던 num
를 넣어준다. 그럼 num
는 num = num / 2
들어가 2로 나누어지고 2로 나누어진num
가 위로 올라가 while문 에서 반복되게 된다. 그러면 2로나누어져 올라간 num
는 다시 while(num !== 1)
에 들어가고 num === 1
이라면 while문
바깥에 있는 return true
로 반환 될것이고, num !== 1
이면 while문
안에 있는 if문
으로 들어가서 if문
에 부합한다면 false
를 리턴할것이고, if문
에 부합하지않는다면 while문
안에 있고,if문
아래에 있는
num = num / 2
에 들어가 2로 나뉘어지게 되고 다시 처음으로 while에 올라가게 된다. 이걸 반복하다보면 if문
에 부합하는 num
는false
로 리턴 되고, 반복끝에 1이 되는 num
는 true
를 리턴하게 된다.
위와 같은 값을 내는 코드를 하나 더적어보겠다. 거의 비슷하고 약간만 다르다.
function powerOfTwo(num) {
while(true){
if(num === 1){
return true;
}
if(num % 2 !== 0){
return false;
}
num = num / 2;
}
return true;
}