반복문(while)

hyo·2021년 9월 13일
0
post-thumbnail

이해 어려운내용 복습

##필자 본인이 이해하기 어려운거 복습하려고 적은거라 뒤죽박죽 일수도있다.

  • 반복문(while),조건문,boolean타입
    문제 - 수를 입력받아 2의 거듭제곱인지 여부를 리턴한다.
    입력 - number타입의 정수 (num >=1)
    출력 - boolean타입을 리턴한다.
    주의사항 -
    1.반복문(while)문을 사용한다.
    2.2의 0승은 1이다.
    3.Number.isInteger, Math.log2, Math.log 사용 금지.

입출력 예시 -

   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 % 2num를 2로 나누었을때 나머지가 결과값으로 나오므로 2로 나누었을때 0이아니라 나머지가 있으면 2의 거듭제곱은 무조건 아니라는걸 알수있다.
2의 거듭제곱이 아닌 numfalse로 리턴 시켜준다. if문에 맞다면 numreturn false로 반환!

if문에서 num가 나누어 떨어져서 나머지가 0이라면 if문에 부합하지 않으므로 while문중괄호 안에 밑에서 반복 시켜줄 num = num / 2를 써주고 나머지가 0이었던 num를 넣어준다. 그럼 numnum = 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문에 부합하는 numfalse로 리턴 되고, 반복끝에 1이 되는 numtrue를 리턴하게 된다.

위와 같은 값을 내는 코드를 하나 더적어보겠다. 거의 비슷하고 약간만 다르다.

function powerOfTwo(num) {
 while(true){
  if(num === 1){
   return true;
  }
  if(num % 2 !== 0){
   return false;
  }
  num = num / 2;
 }
 return true;
}
       
profile
개발 재밌다

0개의 댓글