후위연산식이 주어지면 연산한 결과를 출력하는 프로그램을 작성하세요.
만약 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
인 경우만 숫자로 확인하여 stack
에 push
해주었다.
또한 각자의 방식을 통해 확인한 피연산자를 stack
에 push
할 때, 나는 parseInt()
함수를 통해 각 str
을 integer
로 변환해주었지만, 답안의 경우는 Number()을 통해 변환해주었다는 점을 확인할 수 있다. javascript의 기본 자료형이 integer
가 아닌 Number
라는 점을 고려했을 때에, 나의 방식보다 답안의 방식이 안전한 방식
임을 확인할 수 있다.
마지막으로 코드의 내용과는 별개로 가독성의 면에서, 모든 if
와 else if
문에서 중괄호를 사용한 나와 달리, 중괄호를 사용하지 않은 답안의 코드가 훨씬 더 가독성이 좋다는 것을 확인할 수 있다.
push()
와 pop()
을 활용하여 별도의 struct
생성없이 stack처럼 활용이 가능하다.