본문 바로가기
자기개발/TIL

js 간단한 식 계산하기

by 금화맘 2023. 8. 3.

1개의 문자열에 숫자 기호 숫자 형식으로 들어가 있었고 그걸 계산한 결과를 도출하는 거였다.

처음에는 호기롭게 split을 사용해서 0,1,2번째 인덱스로 나누고, reduce를 사용했었다.

let [n1,n2,n3] = binomial.split(' ') 이렇게 분리를 해서 넣고

var answer = [n1,n2,n3].reduce((a,b)=>a+b,0);

하니 실행한 결괏값 "043+12"이 기댓값 55과 다릅니다. 가 나왔다.

뭐가 문제일까 하다가  문자열이라서 숫자를 넣어야 겠다고 생각을 했고... 문제를 맞이했다.

a+b에다가 어떻게 숫자를 넣지..? 와 +-*는 어떻게 해야하지 였다.

그래서 그냥 단순하게 가기로 했다.

 var answer = Number(n1)+ n2+ Number(n3)로 하기로

근데 실행한 결괏값 "043+12"이 기댓값 55과 다릅니다. 가 나왔다.

뭐가 문제일까.. 고민하다가 n2가 문제인거 같다고 생각해서 객체로 지정할까 했는데 그럼 뭐가 다르지?

싶어졌다.

내가 생각한 객체지정은

const n2 = {

'+' : +,

...}

이런거였다.

이건 너무 번거로울 거 같아서?  Number(n1)+ (+-*)+ Number(n3)인데 너무 번거로운 거 같고, 내가 저게 작동하지 않을 거 같아서 확실하게 if문으로 나눴다.

function solution(binomial) {
  let [n1,n2,n3] = binomial.split(' ')

if(n2 == '+'){
    answer = Number(n1) + Number(n3)
   } else if(n2 == '-'){
       answer = Number(n1) - Number(n3)
   } else{
       answer = Number(n1) * Number(n3)
   }
    return answer;
}

이랬더니 통과했다...ㅎ

이게 너무 늘어지는 거 같아서 다른 사람들의 풀이를 봤다.

const ops = {
  '+': (a, b) => a + b,
  '-': (a, b) => a - b,
  '*': (a, b) => a * b,
};

function solution(binomial) {
  const [a, op, b] = binomial.split(' ');
  return ops[op](+a, +b);
}

이렇게 객체로 지정했는데 너무 편하게?라고 해야하나 늘어지지도 않아서 좋았다고 생각했다. 다만 내가 return을 이해하지 못해서 많이 봐야 했었다. 그래도 한번 이해하고 나니 너무 좋고 편리했다. if문을 써서 늘어지지 않아도 되서 좋았다.

function solution(binomial) {
    const [a,ex,b] = binomial.split(" ");    
    return (ex === "+")? +a+ +b : (ex === "-")? a - b : a*b
}

그리고 위의 코드가 내가 number()로 숫자형으로 바꾼거 대신 +a + +b를 함으로써 숫자형으로 바꿔준 거였다. 이렇게 손쉽게 숫자형으로 바꾼 코드가 많았는데

+a + +b를 한다던가,

a/1 + b/1을 한다던가,

1*a + 1*b를 ㅎ는 사람들도 있었다.

손쉽게 숫자형으로 바꾸는 방법을 여기서 알아서 너무 좋았다.

 

그리고 제일 어이없었던 방법은 eval 이었다.

const solution = eval

이게 뭔가 궁금해서 검색했더니 문자형으로 된 식을 계산해 주는 코드였다.

와... 이런게 있는 줄 몰랐는데 있다는 걸 아는 것만으로도 진짜 너무 편리해지는 거였다. 그러니까 저거 안에 문자열 분리를 하고 숫자형으로 바꾸고 기호에 맞게 계산하는 것마저 들어있다는 거니까 너무 대박이라 생각했다. 내가 한 모든게 저 eval이 어떻게 작동하는지 알기위한 준비라고 생각하니 마음이 편해지기도 했다.