[TIL]성능비교+1주간의회고

Violet Lee·2020년 9월 12일
0

javascript

목록 보기
11/24

TIL을 적기전에..

  • 9월 12일의 TIL의 내용이며, 9월 11일의 TIL은 미완성이므로 이걸쓰고 바로 올릴 예정이다.

0911_TIL 내용
1. 배열,객체 공부
2. 유튜브 체인지 그라운드 의 특정영상을 본 리뷰를 블로깅(+1주간의회고)
3. 문제은행 풀이

0912_TIL 내용
1. 알고리즘 공부
2. 동료와 코드리뷰


오늘 알게된 것 정리

01) object안의 요소들을 in연산자로 돌때, bracket notation을 적용할수있다.

let obj = {a:1,b:2,c:3};
for(let [i] in obj){ //<- 이렇게 대괄호로 감싸주고 도는게 js에선 가능하다.
 delete obj[i];
}
console.log(obj);

02) 특정 수 m이 특정 수 n의 거듭제곱이 맞는지의 여부를 효율적으로 구할 수 있다.

특정 수를 n이라고 한다면, 우선 우리는 이 n이 어떤 수인지 알 수 없다.
그렇기 때문에 n이 짝수인지 홀수인지도 알수 없고, 어떤 특정 수와 관련이 있는지도 알수없다.

하지만 이 n은, n의 거듭제곱의 수를 만들기위해 필수 불가결한 수 임엔 틀림없다.
그렇다면 n의 거듭제곱의 수를 만들기위해선 n을 이용한 식이 필요하단 소리가 된다.

예를 들어 4의 약수는 1,2,4 이며, 4는 2의 거듭제곱이 된다. 여기서 특정 수 m은 4이며, 특정 수 n은 2가 된다.
6의 약수는 1,2,3,6이며, 2의 거듭제곱이다.
8의 약수는 1,2,4,8이며, 2의 거듭제곱이다.
여기까지 생각해보면 앞으로도 짝수의 경우만 특정 수 n인 2의 거듭제곱에 해당될것 같지만
10의 경우는 약수는 1,2,5,10이고, 2의 거듭제곱이 아니므로 짝수의 경우에만 해당이 되는게 아닌것이 밝혀진다.

만약 특정 수 m이 2의 거듭제곱이 맞는지 확인하려면 짝수의 경우를 먼저 생각할 수 있겠지만, 해당 특정 수 m이 2로 계속 쪼개질수 있어야 하므로 10의 경우는 2의 거듭제곱이 될 수 없는것이다.

내가 맨 처음에 생각한 식은 이것이었다.

//n은 3, m은 9인 경우
 /*
  테스트 해본 결과, n이 m의 거듭제곱인지 알려면
  1.  while문으로 1씩 i를 증가시키면서, if문으로  m^i이 n의 제곱, 혹은 n으로 나누어떨어지는것을 찾는다.
  2. 맞으면 true, 아니면 false를 해보자.
 */
  
//n이 3인 경우
let i=0;
while(i<1000){
    if(Math.pow(n,m)===1){ //3의 0승은 1이라고 할때, 예외이므로 true반환.
        return true;
    }else if(Math.pow(n,i)%m===0){ //n=3의 i승이 m으로 나누어지면, m은 n으로 계속 나누어떨어진단 얘기이므로 m은 n의 거듭제곱. true반환. 
        return true;
    }    
  i++; //i는 1씩 증가.
}//while-end
    return false; //이외의 경우들은 전부 false처리.

그러나 1차로 생각한 위의 코드는 문제가 조금많이 있다.
위 코드는 i가 1000정도의 큰 수일때만 몇몇의 수를 판단할수 있으며,
사실 i의 값은 1이나 2같은 수여도 상관없다.

만약 위의 코드에 인자로 2와 1을 주고, 값을 나타내보자.
답은 의도되지않은 true가 나온다. 1의 거듭제곱은 2가 아닌데말이다. 왜일까?

else if문을 보면, 예를 들어 n에 2를 넣고, m에 1을 넣고, i가 0일때, Math.pow(2,0)은 1이고, 이를 m인 1로 나누면 나머지가 0이 나와서 true가 나와버리게 되는것이다.
그렇다면 n=5,m=1 을 넣어도 마찬가지일거다. 수학에서 n의 0승은 1이므로, 1을 1로 나눈 나머지는 반드시 0이기 때문에 true가 나올수밖에 없는것이다.

m이 n보다 큰 경우도 문제가 생긴다. 예를들어 n=1,m=5의 경우, false가 나와야한다. 그런데 이미 코드의 if조건에서, Math.pow(1,5)는 1의 5 거듭제곱은 1이니까 디폴트로 true가 나와버리게 되는것이다.

코드 리뷰
잘못된 조건을 준 코드이다.

해서 다른 방법을 강구한 결과, 더 비교적 직관적이고 괜찮은 코드를 동기로부터 알아냈다.


  while(m % n === 0){
   m = m / n;
   } if (m === 1) {
    return true;
  } return false;

코드 리뷰
만약 256, 2 로 아닌경우, 일단 while문 입성은 실패하고 m!==1 이 아니므로 false가 나오며,

256, 1로 맞는경우, 일단 while문안에 입성해서 m = 256 / 1을 한 256을 재할당하고, 무한정 while문을 돌리게해서 이부분은 나중에 처리!

5,25로 딱 맞는경우, while문안에 입성해서, m = 25 / 5 = 5를 재할당하고, 5%5 === 0이니까 또 입성해서 m = 5 / 5 = 1을 재할당하고, 1%5 !==0 이니까 빠져나와서 m===1이므로 true나오고,

5,10 의 아닌경우, 5%10 === 5니까 일단 while문 입성은 실패하고 건나뛴뒤,m !==1 이니까 false 처리가 되도록 했고,

이 코드의 사소한 문제가 있었다면, 바로 예를 들어 256,1처럼 m이 1이고, n>m이고 거듭제곱이 맞을때의 경우이다.
1의 거듭제곱은 256이 아니므로 false값이지만, 이 코드의 경우, 256을 1로 나눠서 0이 남을때까지 256을 1로 무한으로 계속 나누게되버리므로 while문을 빠져나오지 못하게되는것이다.

그래서 나는, n이 1인 경우에 false를 토해내게 추가로 조건을 작성해주었다.


1주간의 회고?
알고리즘의 공부는 계속 ing을 할 것이며, 한 문제를 고민하는것에 시간이 많이 든것 같아 더욱더 노력을 해야겠다.
금요일 저녁에 정규시간에 만나는 페어님, 그리고 다른 동기들과 함께 모각코를 진행해보았다.
동기들과 문제와 해결을 공유하면서 실력이 정말 많이 는다는걸 깨달았다. 특히 한 문제라도 같이 고민하는 과정에서 사소해도 엄청난 정보와 노하우를 얻게된다. 7기 동기님들 짱짱👍👍
그리고 나는 상황상 이전과는 다른 노력을 하여 개발자로 성장을 해야한다.
내 자신을 다잡기위해 금요일에 몇 개의 영상을 봤는데, 굉장히 도움이 되었다. 누구나 딴짓을 안할수는 없지만, 자신을 더 컨트롤하는것은 가능하다는것. 얼만큼 노력을 하느냐..가 결국 관건.
그거 보고 좀 정신을 차렸다. 이대로 쭉쭉 가자.
+js코드끼리 성능을 비교할 수 있는 사이트를 찾는중인데, 쉽지않다.
+수학적인 사고 마련해야하는데, 시간을 어떻게 내지..
+프로그래머스 언제 풀지?ㅠㅠ

profile
예비개발자

0개의 댓글