CODEKATA #32

12511 단어 TILTIL

후위식 연산(postfix)

후위연산식이 주어지면 연산한 결과를 출력하는 프로그램을 작성하세요.
만약 3(5+2)-9 을 후위연산식으로 표현하면 352+9- 로 표현되며 그 결과는 12입니다.

나의 풀이

function solution(s) {
  let answer;
  let num = '1234567890';
  let exp = [];
  for (let i of str) {
    if (num.indexOf(i) !== -1) {
      exp.push(parseInt(i));
    } else {
      let b = exp.pop();
      let a = exp.pop();
      let result;
      if (i === '+') {
        result = a + b;
      } else if (i === '-') {
        result = a - b;
      } else if (i === '*') {
        result = a * b;
      } else if (i === '/') {
        result = a / b;
      }
      exp.push(result);
    }
  }
  answer = exp.pop();
  return answer;
}

let str = '352+*9-';
console.log(solution(str));

정답 풀이

function solution(s){  
  let answer;
  let stack=[];
  for(let x of s){
    if(!isNaN(x)) stack.push(Number(x));
    else{
      let rt=stack.pop();
      let lt=stack.pop();
      if(x==='+') stack.push(lt+rt);
      else if(x==='-') stack.push(lt-rt);
      else if(x==='*') stack.push(lt*rt);
      else if(x==='/') stack.push(lt/rt);
    }
  }
  answer=stack[0];
  return answer;
}

let str="352+*9-";
console.log(solution(str));

다른 점

변수명을 제외하고 다른 부분은 크게 주어진 후위식에 대한 처리str인 피연산자의 변환 방식이다.
나의 풀이의 경우는 let num = "1234567890";을 통해서 num이라는 문자열을 선언해주고, 그 문자열에 대해 indexOf() 함수를 사용하여 각 글자가 숫자인지 여부를 확인했는데, 그에 반해 정답에서는 isNan()을 활용하여 false인 경우만 숫자로 확인하여 stackpush해주었다.
또한 각자의 방식을 통해 확인한 피연산자를 stackpush할 때, 나는 parseInt() 함수를 통해 각 strinteger로 변환해주었지만, 답안의 경우는 Number()을 통해 변환해주었다는 점을 확인할 수 있다. javascript의 기본 자료형이 integer가 아닌 Number라는 점을 고려했을 때에, 나의 방식보다 답안의 방식이 안전한 방식 임을 확인할 수 있다.
마지막으로 코드의 내용과는 별개로 가독성의 면에서, 모든 ifelse if문에서 중괄호를 사용한 나와 달리, 중괄호를 사용하지 않은 답안의 코드가 훨씬 더 가독성이 좋다는 것을 확인할 수 있다.

기록할 점

  • 자료구조 강의에서 해당 과제를 이미 풀어본 경험이 있었는데, 해당 과제의 경우에는 중위식으로 제공된 수식을 후위식으로 변환한 후에 계산을 하는 방식이었다. 중위식을 후위식으로 변환하는 javascript 코드도 작성해 볼 것
  • 위의 코드에서, 후위식의 연산에 2자리 이상의 숫자가 들어있는 경우에는 어떻게 인식을 해야할까? -> "3523+*9-"에서 피연산자와 연산자의 짝을 먼저 맞춰보아야한다? 그렇다면 맞지 않는 경우에 35인지, 52인지, 23인지 확인할 방법은? 두자릿수 이상의 숫자를 처리하는 방식은 애초에 후위식이 stack형태에 저장되어있는 경우는 처리가 간편하나(각 pop()단위로 처리) 문자열의 형태로 저장된 경우 어렵다
  • javascript의 Array은 리스트와 비슷한 형태로, 기본적으로 내장된 함수 push()pop()을 활용하여 별도의 struct 생성없이 stack처럼 활용이 가능하다.

좋은 웹페이지 즐겨찾기