CODEKATA #32
후위식 연산(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
인 경우만 숫자로 확인하여 stack
에 push
해주었다.
또한 각자의 방식을 통해 확인한 피연산자를 stack
에 push
할 때, 나는 parseInt()
함수를 통해 각 str
을 integer
로 변환해주었지만, 답안의 경우는 Number()을 통해 변환해주었다는 점을 확인할 수 있다. javascript의 기본 자료형이 integer
가 아닌 Number
라는 점을 고려했을 때에, 나의 방식보다 답안의 방식이 안전한 방식
임을 확인할 수 있다.
마지막으로 코드의 내용과는 별개로 가독성의 면에서, 모든 if
와 else if
문에서 중괄호를 사용한 나와 달리, 중괄호를 사용하지 않은 답안의 코드가 훨씬 더 가독성이 좋다는 것을 확인할 수 있다.
기록할 점
- 자료구조 강의에서 해당 과제를 이미 풀어본 경험이 있었는데, 해당 과제의 경우에는 중위식으로 제공된 수식을 후위식으로 변환한 후에 계산을 하는 방식이었다. 중위식을 후위식으로 변환하는 javascript 코드도 작성해 볼 것
- 위의 코드에서, 후위식의 연산에 2자리 이상의 숫자가 들어있는 경우에는 어떻게 인식을 해야할까? -> "3523+*9-"에서 피연산자와 연산자의 짝을 먼저 맞춰보아야한다? 그렇다면 맞지 않는 경우에 35인지, 52인지, 23인지 확인할 방법은? 두자릿수 이상의 숫자를 처리하는 방식은 애초에 후위식이 stack형태에 저장되어있는 경우는 처리가 간편하나(각 pop()단위로 처리) 문자열의 형태로 저장된 경우 어렵다
- javascript의 Array은 리스트와 비슷한 형태로, 기본적으로 내장된 함수
push()
와pop()
을 활용하여 별도의struct
생성없이 stack처럼 활용이 가능하다.
Author And Source
이 문제에 관하여(CODEKATA #32), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@loopbackseal/CODEKATA-32저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)