[백준 | Javascript] 1935

박기영·2022년 9월 6일
0

백준

목록 보기
101/127

기초 알고리즘 1/2. 203 - 자료 구조 1(참고)
1935번. 후위 표기식2

문제

1935번 문제 링크

solution

const fs = require("fs");
let input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");

let iter = Number(input.shift());

let str = input.shift().split("");

input = input.map((item) => Number(item));

// 알파벳에 해당하는 값을 key - value로 만들어놓자.
let eng = {};

// 대문자 A의 ASCII 코드 번호가 65이므로
// A부터 순차적으로 실행
for(let i = 0; i < iter; i++){
    eng[String.fromCharCode(i + 65)] = input[i];
}

// 조건문 처리를 위해서 연산자만 따로 모아놓는다.
const operators = ["+", "-", "*", "/"];

// 연산자에 맞게 함수를 만들어놓는다.
const calculator = {
    "+": (a, b) => a + b,
    "-": (a, b) => a - b,
    "*": (a, b) => a * b,
    "/": (a, b) => a / b,
};

let stack = [];

// 만약 str의 원소가 연산자가 아니라면 eng에 있는 value를 가져와서 바꿔준다.
// 그렇게 알파벳에 해당하는 값을 가진 배열로 변신!
const numWithStr = str.map((item) => operators.includes(item) ? item : eng[item]);

for(let i = 0; i < str.length; i++){
    let singleStr = numWithStr[i];

  	// 만약 연산자라면 계산 실행
    if(operators.includes(singleStr)){
        let back = stack.pop();
        let front = stack.pop();
        
        // 연산자에 맞는 함수를 불러온다.
        let calcFunc = calculator[singleStr];
        
        // singleStr을 연산 결과로 바꿔서 stack에 넣는다.
        singleStr = calcFunc(front, back);
    }
    
    // 연산자가 아니라면 stack에 넣는다.
    stack.push(singleStr);
}

// 소수점 아래 2자리까지 표현해야하므로 toFixed 메서드를 사용한다.
console.log(stack[0].toFixed(2));

이번 문제는 스택을 어떻게 쓸지 고민하다가 시간을 넘겨버렸다.
다른 분의 풀이를 참고했는데, calculator 부분이 인상적이다.
객체의 value에 함수를 넣을 수 있구나..!

참고 자료

참고 자료 1

profile
나를 믿는 사람들을, 실망시키지 않도록

0개의 댓글