본문 바로가기
JavaScript

TIL 1011 복리계산 거듭제곱 아스키코드 repeat() 빈 배열, 객체의 타입 객체의 메서드 정의 배열에서 가장 긴 문자열

by 짱닭 2020. 10. 12.
반응형

연이율을 알 때 복리계산

내코드

function interest(interestRate) {
  /* 
    원금*이자율/100 > 2 될 때 까지 year를 카운트
   */

  let year=1;
  while(true){
    if((1+(interestRate/100))**year >= 2){
      return year;
    }
    year++;
  }
}

복리로 증가하는 원금 일반식
( 원금 + (연이율 / 100) )^year(연수)

원금을 1로 두고 원금이 2배 이상되는 시점까지 걸리는 연수를 카운트했다.

참고 : www.mathsisfun.com/money/compound-interest.html

다른방법

function computeWhenDouble(interestRate) {
  let rate = 1 + interestRate / 100;
  let principal = 1;
  let year = 0;
  while (principal < 2) {
    principal = principal * rate;
    year++;
  }
  return year;
}

원금을 1로 둔 것은 같으나
이번엔 원금에 계속 이자율을 곱한 값을 할당해서 매년 복리로 증가하는 원금을
변수에 저장해서 관리한 점이 다르다.

거듭제곱

입력받은 수가 2의 거듭제곱인지 확인하는 문제.

내 로직 : 1, 2인 경우를 제외하고 입력된 수를 2로 나누고
나눈 결과에 소수점이 발생하면

if(Math.floor(num) !== num) {
 return false; 
}

(소수점이 발생하는 순간 2의 거듭제곱이 아니므로)

다른방법 : 1, 2를 제외하고 2에 계속 2를 곱해주면서 입력된 수보다 커지면
입력된 수와 같은지 검사해서 리턴.

let powered = 2;
  while (powered < num) {
    powered = powered * 2;
  }

  return powered === num;

아스키코드

아스키코드표를 참고해서 문자를 코드표 앞이나 뒤로 옮길 때 참고.

내 코드 :


  // 97~122 아스키코드 범위
  let result='';

  ...

    if((str.charCodeAt(i)-secret)>=97){

      result+=String.fromCharCode(str.charCodeAt(i)-secret);

    }else if((str.charCodeAt(i)-secret)<97){
      //소문자 a의 코드보다 아래로 가면 대문자 Z 부터 다시 순환하도록

      result+=String.fromCharCode(str.charCodeAt(i)-secret+26);

      //알파벳 개수만큼 +해준다
    }
  }

  return result;
}

secret에 할당된 숫자만큼 알파벳 아스키코드를 이동시키는 코드.

다른방법


  // 알파벳
  let alpha = 'abcdefghijklmnopqrstuvwxyz';

  let result = '';

  ...

      let asis = alpha.indexOf(str[i]);

      // 복호화는 반대 방향으로 이루어기 때문에 seceret을 뺀다.
      let tobe = (asis - secret + alpha.length) % alpha.length;

      result = result + alpha[tobe];
    }
  }

  return result;
}

나머지 연산자(%)를 통해 알파벳 범위를 넘어가는 아스키코드 숫자를 조절한다.

repeat()

인자로 전달된 숫자만큼 문자열을 반복시켜 리턴.

let str='a';
let repeatStr = str.repeat(3);

repeatStr === 'aaa';

typeof 빈 배열, 빈 객체

빈 배열은 typeof arr !== 'array'
빈 객체는 typeof obj === 'object'

객체의 메서드 정의 방법 2가지

      getFusion: function () {
        return this.henchman + this.mastermind;
      },



      battleCry(numOfBrains) {
        return (
          `They are ${this.henchman} and the` +
          ` ${this.mastermind}`.repeat(numOfBrains)
        );
      },

배열에서 가장 긴 문자열

입력된 배열의 요소중 가장 긴 문자열을 리턴.

let lengtharr= arr.map(x => x.length);

  let max=Math.max.apply(null, lengtharr); //가장 긴 문자열의 길이

  let indexOfMax=arr.filter(function(ele){
    if(ele.length===max){
      return ele;
    }
  });

  return indexOfMax[0];

문자열 길이만 요소로 갖는 배열을 만들어서
Math.max.apply()를 이용해서 배열에서 가장 큰 숫자(가장 긴 문자열의 길이)를 구한다.
배열을 순환하며 요소의 길이가 가장 긴 문자열의 길이와 일치하면 그 요소(문자열)을 리턴.

filter를 사용한 부분은 반복문으로 대체하는 것이 더 간단하다.
이 문제에선 반복문을 사용하지 않기 위해 filter 사용.

다른방법

  return arr.reduce(function (a, b) {
    if (a.length >= b.length) {
      return a;
    } else {
      return b;
    }
  }, '');

reduce()를 이용.
길이가 같으면 앞쪽 인덱스 리턴하기위해 비교식에서 >= 사용.

반응형

댓글