Today I Learned - 04

dk.han·2021년 7월 24일
0
post-thumbnail

오늘은 코플릿 문제를 풀면서 새로 알게된 개념들을 정리해보는 시간을 가지려 한다.

거듭제곱 연산 3가지 방법

  1. 거듭제곱 해주고 싶은만큼 곱해주는 방법
a*a*a // =3a 
x*x   // =2x
  1. ** 거듭제곱 연산자를 사용하는 방법
3**3 // =27 
2**5 // =32
  1. Math.pow(a,b) Method 사용
Math.pow(4,2) // =16 
Math.pow(5,3) // =125

Math.pow는 Math 객체의 Method들 중 하나인데 코플릿을 풀면서 사용한 다른 Method를 정리해본다.

  • Math.abs( )
    주어진 숫자의 절대값을 반환하는 Method.
    결과값 x 가 양수라면 x로, 결과값 x가 음수라면 반대값 양수를 반환.
function difference(a, b) {
  return Math.abs(a - b);
}

console.log(difference(3, 5)); // expected output: 2
console.log(difference(1.234, 7.890)); // expected output: 6.656
  • Math.floor( )
    주어진 수 이하의 가장 큰 정수를 반환.
    쉽게 말해서 수학에서 배우는 버림 이라고 이해하면 쉬움.
Math.floor( 21.88); //  21
Math.floor(-35.88); // -35
  • Math.sqrt( )
    주어진 숫자에 루트(√ )를 씌움. 만약 숫자가 음수이면 NaN를 반환.
Math.sqrt(9); // 3
Math.sqrt(2); // 1.414213562373095

Math.sqrt(1);  // 1
Math.sqrt(0);  // 0
Math.sqrt(-1); // NaN

str 객체 Method들도 사용했는데 그중 str.slicestr.substring의 차이에 대해 궁금했다.

str.slice / str.substring

  • 두 method 모두 start index와 end index를 매개변수로 가진다
  • 또한 똑같이 end index를 제외하고 결과값이 return된다
let str = "사랑합니다!"

console.log(str.slice(0, 3)); // expected output: "사랑합"
console.log(str.substring(0, 3)); // expected output: "사랑합"

그럼 차이점은??

  • strat index > end index 일 경우.
    str.substring
    start와 end의 값을 바꾸어서 처리.
    즉 str.substring (4, 0) 은 str.substring (0, 4)과 동일하게 처리됨.
    str.slice
    비어있는 string, " "을 return함.
  • 매개변수 값이 음수인 경우.
    str.substring
    str.substring (-1, 5)가 입력된다면 str.substring (0, 5)와 동일한 결과.
    str.substring (2, -2)가 입력된다면 str.substring (2, 0) = str.substring (0, 2)와 동일한 결과.
    음수가 오게 되면 0으로 처리한다.
    str.slice
    양수는 string의 맨앞부터 index를 실행하지만 음수의 경우는 string의 가장 끝부터 index를 실행
let str = "사랑합니다!"

console.log(str.slice(-3, 5)); // =str.slice(3, 5)
console.log(str.slice(0, -2)); // =str.slice(0, 4)

parseInt(str, radix) / parseFloat(value)

  • 입력값이 숫자로 이루어진 string일때 이것을 number 타입의 데이터로 변환해주는 함수이다.
  • parseInt(str, radix)에서 radix는 2~36진법 중 return받기 원하는 진법을 넣어 주어야 한다. default값이 10진법이 아니기 때문!
    두가지 방법 모두 숫자가 아닌 문자열을 만나게 된다면 NaN 을 return한다.
let str1 = "12345";
let str2 = "바보";

console.log(parseInt(str1)); // = 12345
console.log(parseFloat(str1)); // = 12345
console.log(parseInt(str2)); // = NaN
console.log(parseFloat(stR2)); // = NaN

코플릿 복습하면서 실수한 부분 및 적어놓고 싶은 부분들.

- 반복문 3번 isOdd

num를 입력 받아서 홀수 여부를 boolean 으로 return하는 문제
실행문 이외에도 return이 어디에 들어가야하는지 항상 고민해볼것!

  while ( 0 <= num ) {
    
    //num = num - 2
    
// 처음에 실행문을 여기다 놓앗더니 num=0, num=1일때 결과값이 undefined
// 여기다 놓을 경우 num=0/num=1 이면 ouput이 num=-2/num=-1이기 때문. 
// 실행문은 while문에 속하기 때문에 if문과는 상관이 없을거라고 생각함.
     
    if ( num === 0) {
      return false;
    } else if (num === 1) {
      return true;
    }
    
    num = num - 2 
  // 실행문이 있어야 할 자리는 여기! while문 안에 있으면서 if문이 끝나고 난후 실행이 되도록!!
  }

- 반복문 17번 isPrime

자연수 num을 받아 소수(prime number)인지 여부를 boolean으로 return하는 문제
코드를 간단하게 짜기 위해 조건들을 하나씩 배제해야 한다는 걸 느낀 문제.

  if ( num === 1) { // 1은 소수가 아니니깐~
    return false;
  }

  if ( num === 2) { // 2 이외에는 소수에 짝수는 없기때문에 따로 빼주고.
    return true;
  }

  if ( num % 2 ===0 ) { // 짝수는 모두 배제하기 위해 써준것.
    return false;
  }

  for (let n = 3 ; n < num; n=n+2 ) {// 홀수만 판별하기 위해서 n=3 부터, n은 +2씩 !
    if (num % n === 0) {   // 소수는 1과 자기자신 이외에 약수가 없기 때문에 만든 조건.
      return false;       
    }
  }
  return true;

- 반복문 18번 listPrimes ( 가장 어려웠던 문제 )

1 이상의 자연수를 입력받아 2부터 해당 수까지의 소수(prime number)들을 리턴
이중 반복문, break에 대해 배울 수 있었던 문제.
밑의 코드가 어떻게 돌아가는지 메커니즘을 이해하는게 가장 중요하다고 생각했다.

function listPrimes(num) {
  
  let result = '2'; // 최초 result가 2이므로 (이해됨)

  for ( let n = 3 ; n <=num ; n=n+2) {  // 소수로 판별되어 질 변수 n
    
       let primeNum = true;//우선 홀수면 primeNum = true라 하고 다음 for문으로 넘김
    //다음 for문에서 if (n % m === 0 ) 이 조건으로 false인지를 판별하는거지!!
       
    for( let m = 2; m < n; m++){ // 소수로 판별하기위해 n을 나눌 변수 m
      if (n % m === 0 ) { // 그래서 n/m 했을때 나머지가 0이면 소수가 아니니깐
        primeNum = false;  // primeNum 이 false가 되는거고
        break;             // break에 의해 loop가 stop. 모든 loop를 멈추는게 아닌 j만 멈춤.
      }                    // i는 loop는 계속 돌아가는거야!
    }

    if (primeNum) {
      result = result + `-${n}`    //그래서 break가 실행되지 않은 n은 primeNum = true;
                                   //에 의해 result에 추가되는거고
    }
  }
  return result;  // n<=num 조건에 맞는 n까지 다 수행된 result가 return 되게 되는거지.
}

이외에도 반복문에는 어려운 문제가 많앗으니 꾸준히 복습하도록 하자.

0개의 댓글