-
[백준] 1935번 후위 표기식2(javascript)알고리즘 2023. 3. 28. 02:22728x90
https://www.acmicpc.net/problem/1935
후위 표기식을 처음들어봤고 감이 전혀 잡히지 않아 구글링을 통해 문제를 풀게 되었다.
입력값에서 피연산자의 개수와 후위 표기식, 후위표기식에 대응하는 값이 주어져서 어떻게 분해해야 하나 싶었는데, rest 문법을 사용하면 되는 문제였다. 분명 공부했는데 머릿속에서 떠오르지 못해서 아쉽다.
후위 표기법의 핵심은 연산자를 만나면 연산자 직전의 두 숫자를 연산해주고 다시 스택에 넣는 것이다.
정답 코드는 다음과 같다.
// 1935 : 후위 표기식2 const readFile = '/dev/stdin'; const input = require('fs') .readFileSync(readFile) .toString() .trim() .split('\n'); const [n, mark, ...nums] = input; const numbers = nums.map((i) => Number(i)); let ASCII = 65; const stack = []; const operators = ['-', '/', '+', '*']; const transformer = {}; const calculator = { '+': (a, b) => a + b, '-': (a, b) => a - b, '*': (a, b) => a * b, '/': (a, b) => a / b, }; // a, b, c, d ... 에 해당하는 값 넣기 for (let i = 0; i < n; i++) { const alphabet = String.fromCharCode(ASCII++); transformer[alphabet] = numbers[i]; } // a, b, c, d ... 에 해당하는 값 대입 const transformExpression = mark .split('') // 연산자이면 원래 값 그대로, 아니라면 해당 값으로 대체 .map((value) => (!operators.includes(value) ? transformer[value] : value)); for (let i = 0; i < transformExpression.length; i++) { let pushValue = transformExpression[i]; // 연산자일 경우 if (operators.includes(pushValue)) { const secondValue = stack.pop(); const firstValue = stack.pop(); // 해당 연산 저장 const calculateFunction = calculator[pushValue]; // 연산 수행 pushValue = calculateFunction(firstValue, secondValue); } stack.push(pushValue); } console.log((Math.floor(stack[0] * 100) / 100).toFixed(2));
이번에 새롭게 알게 된 점이 있다.
항상 코테 문제를 풀 때, 백준 제출할 시에는 readFileSync 에 '/dev/stdin' 경로를 넘겨주고 vscode에서 풀 때는 테스트용 파일 경로(’test.txt’)를 넘겨줬었다.
const input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');
이번 문제를 풀면서 알게된 좋은 방법인데, 이렇게 설정하면 계속 바꾸지 않고 주석처리만 하면 되서 편리한 방법인 것 같다. 사실 조금만 생각해보면 이렇게 바꿀 수 있는 코드였는데, 타인의 코드를 보고 이걸 알게 된 점이 부끄럽다. 자바스크립트와 조금 더 친해져서 활용을 많이 할 수 있도록 노력해야겠다.
// 백준 제출 const readFile = '/dev/stdin'; // vscode 실행 const readFile = 'test.txt';
참고
728x90'알고리즘' 카테고리의 다른 글
[백준 / javascript] 2816번 디지털 티비 (0) 2023.03.29 [백준 / javascript] 13458번 시험감독 (1) 2023.03.29 [백준] 1931번 회의실 배정(javascript) (0) 2023.03.24 [백준] 10798번 세로읽기(javascript) (0) 2023.03.21 [백준] 2960번 에라토스테네스의 체(javascript) (0) 2023.03.21