-
[JS] postfix를 이용해 실제로 계산하기programing/Language 2018. 10. 9. 22:39
안녕하세요, Einere입니다.
이번엔 저번에 포스팅했던, postfix를 이용해 실제로 계산하는 코드를 알아보겠습니다.
전체 코드
function calcul(a, b, oper){ let result = 0; switch(oper){ case "+":{ result = a + b; break; } case "-":{ result = a - b; break; } case "*":{ result = a * b; break; } case "/":{ result = a / b; break; } } return result; } let priority = new Map(); priority.set("+", 1); priority.set("-", 1); priority.set("*", 2); priority.set("/", 2); process.stdin.setEncoding('utf8'); process.stdin.on('data', data => { var line = data.trim() let infix = line.split(' '); let numbers = []; let operators = []; let postfix = []; for(let e of infix){ //translate to postfix //if e is number if(!isNaN(parseInt(e, 10))){ postfix.push(parseInt(e, 10)); } //if e is "(" else if(e === "("){ operators.push(e); } //if e is ")" else if(e === ")"){ while(operators[operators.length - 1] != "("){ postfix.push(operators.pop()); } operators.pop(); } //if e is operator else{ if(operators.length == 0){ operators.push(e); } else{ while(operators.length != 0 && operators[operators.length - 1] != "(" && (priority.get(operators[operators.length - 1]) >= priority.get(e))){ postfix.push(operators.pop()); } operators.push(e); } } } while(operators.length != 0){ postfix.push(operators.pop()); } console.log(postfix); //calculate for(let e of postfix){ //if e is number if(!isNaN(parseInt(e, 10))){ numbers.push(e); } //if e is operator else{ let b = numbers.pop(); let a = numbers.pop(); numbers.push(calcul(a, b, e)); } } console.log(numbers[0]); });
위의 코드는 한줄씩 입력받아서, postfix와 result를 출력하는 코드입니다.
사실, postfix로 변환된 수식은 계산하는 것은 매우 쉽습니다.
숫자는 무조건 numbers스택에 넣고, 연산자는 무조건 numbers스택의 top숫자 2개를 pop해서 연산한 뒤 다시 push해주면 끝이기 때문입니다.
물론 해당 코드는 전제조건으로 수식은 공백으로 구분되며, 반드시 괄호는 balance하고, 0으로 나누거나 등의 예외가 없는 경우에 한해서만 작동합니다.
추가적인 예외처리사항이 있다면 해주면 되겠죠?
여러가지 알고리즘은 잘 모르는 상태에선 매우 구현하기 힘든 것 같습니다.
코딩테스트에서도 나왔는데, 분명히 배웠던 건데 다시 구현할려니 머리도 안돌아가고.. 막막해서 결국 제출하지 못했습니다..ㅠㅠ
그래서 오기로 복습하고 구글링하면서 완성했습니다.
여러분들은 테스트전에 꼭 리뷰해서 안틀리도록 하세요!
'programing > Language' 카테고리의 다른 글
[Pycharm] '_xsrf' argument missing from POST 오류 해결법 (0) 2018.10.30 [Python] Arbitrary Argument Lists (0) 2018.10.30 [JS] js의 data structure (0) 2018.09.28 [npm] permission 관련 오류 해결법 (1) 2018.08.27 [Vue] vetur beautify 들여쓰기 설정하는 법 (4) 2018.08.18 댓글