정현수
현수 세상
정현수
전체 방문자
오늘
어제
반응형
  • 분류 전체보기 (267)
    • NEXTSTEP 자바스크립트 클린코드 2기 (1)
    • 우테코 4기 (6)
    • 회고록 (5)
    • 개발지식 (6)
    • React (3)
      • React Clone Coding (3)
    • React Native (2)
    • Kubernetes & Docker (36)
      • 궁금한 것 (13)
    • Flutter (2)
    • 알고리즘 (168)
      • 프로그래머스 1단계 (27)
      • 프로그래머스 2단계 (37)
      • 백준 (98)
      • 이론 (6)
    • 자료구조 (3)
    • 유튜브 (1)
    • 책 읽자 (1)
    • 취업준비 (1)
    • 대내 활동 (31)
      • 2022년 겨울방학 알고리즘 특강 (0)
      • 2020년 여름방학 모각코 (13)
      • 2020년 겨울방학 모각코 (13)
      • 웹프로그래밍 상상튜터링 (5)

인기 글

최근 글

공지사항

  • 블로그 이동

태그

  • 이코테
  • Deployment
  • Kubernetes
  • 알고리즘
  • 자바스크립트
  • image run
  • NodePort
  • 공식문서
  • 파이썬
  • replicaset
  • 디플로이먼트
  • 그리디
  • 우테코
  • 모각코
  • 리액트
  • 개발지식
  • flutter
  • javascript
  • 레플리카셋
  • 백준
  • mysql
  • programmers
  • docker
  • 노드
  • React
  • kubelet
  • 프로그래머스
  • image pull
  • Jenkins
  • 쿠버네티스

최근 댓글

블로그 메뉴

  • 홈

티스토리

hELLO · Designed By 정상우.
정현수

현수 세상

[백준] 1935번: 후위 표기식2 (JavaScript, NodeJS)
알고리즘/백준

[백준] 1935번: 후위 표기식2 (JavaScript, NodeJS)

2022. 1. 10. 17:44
반응형

문제

후위 표기식과 각 피연산자에 대응하는 값들이 주어져 있을 때, 그 식을 계산하는 프로그램을 작성하시오.

입력

첫째 줄에 피연산자의 개수(1 ≤ N ≤ 26) 가 주어진다. 그리고 둘째 줄에는 후위 표기식이 주어진다. (여기서 피연산자는 A~Z의 영대문자이며, A부터 순서대로 N개의 영대문자만이 사용되며, 길이는 100을 넘지 않는다) 그리고 셋째 줄부터 N+2번째 줄까지는 각 피연산자에 대응하는 값이 주어진다. 3번째 줄에는 A에 해당하는 값, 4번째 줄에는 B에 해당하는값 , 5번째 줄에는 C ...이 주어진다, 그리고 피연산자에 대응 하는 값은 100보다 작거나 같은 자연수이다.

후위 표기식을 앞에서부터 계산했을 때, 식의 결과와 중간 결과가 -20억보다 크거나 같고, 20억보다 작거나 같은 입력만 주어진다.

출력

계산 결과를 소숫점 둘째 자리까지 출력한다.

예제 입력 1 복사

5
ABC*+DE/-
1
2
3
4
5

예제 출력 1 복사

6.20

예제 입력 2 복사

1
AA+A+
1

예제 출력 2 복사

3.00

정답 풀이

const fs = require("fs");

// 백준 제출 할 때 주석 제거
// const readFileSyncAddress = '/dev/stdin';

// VSC 테스트 할 때 주석 제거
const readFileSyncAddress = "input.txt";

const input = fs.readFileSync(readFileSyncAddress).toString().trim().split("\n");

const [n, expression, ...nums] = input;
const numbers = nums.map(i => Number(i));

// 문제 풀이
function solution(n, expression, numbers) {
	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,
	};

	for (let i = 0; i < n; i += 1) {
		const alphabet = String.fromCharCode(ASCII++);
		transformer[alphabet] = numbers[i];
	}

	const transformExpression = expression.split('').map(value => !operators.includes(value) ? transformer[value] : value);

	for (let i = 0; i < transformExpression.length; i += 1) {
		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);
	}

	return (Math.floor(stack[0] * 100) / 100).toFixed(2);
}

// 제출
const answer = solution(n, expression, numbers);
console.log(answer);

스택을 활용한 문제였다.

우선 후위표기식을 처음들어봐서 검색을 해보았다.

 

https://woongsios.tistory.com/288

 

후위표기식 변환

안녕하세요 :) 오늘은 사람들이 일반적으로 사용하는 중위표기식(infix)을 후위표기식(postfix)으로 변환하는 방법에 대해 알아보겠습니다. 후위표기식? 먼저 중위표기식과 후위표기식에 대해 알아

woongsios.tistory.com

 

623+-45-+ 로 설명을 하면

연산자 (+, -, *, /)를 만나면 그 직전의 두 개의 숫자를 연산을 하면된다.

 

+를 만나면 그 전의 두 숫자, 2와 3을 더하는 것이다. 그리고 다시 스택에 넣는 식.

그러면 65-45-+ 이렇게 남는다.

그럼 또 6와 5를 -를 하면된다.

145-+ 이렇게 남는다.

그러면 다시 1 - 4를 계산하면 -35+

마지막으로 -3 + 5를 하면 정답은 2가 된다.

 

핵심은 연산자를 만나면 연산자 직전의 두 숫자를 연산해주고 다시 스택에 넣는다이다.

 

위의 아이디어를 얻고 나면 크게 어렵지 않았다.

마지막에 출력을 해줄 때 소숫점 두번 째 자리까지 출력을 해야해서

 (Math.floor(stack[0] * 100) / 100).toFixed(2);

와 같은 작업을 해주었다.

해당 방법은 아래를 참고했다.

https://shwjdqls.github.io/javascript-show-float-number/

 

[Javascript] 소수점 특정 자리수까지 0으로 채워서 표시하기

소수를 소수점 이하 특정 자리수까지 0으로 채워서 표시하고 싶을때는 어떻게 할까? Javascript에서는 float형에서 toFixed라는 함수를 제공한다. 다음은 소수점 둘 째자리까지 반올림하고 특정 변수

shwjdqls.github.io

 

 

 

반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 1966번: 프린터 큐 (JavaScript, NodeJS)  (0) 2022.01.11
[백준] 10799번: 쇠막대기 (JavaScript, NodeJS)  (0) 2022.01.11
[백준] 1874번: 스택 수열 (JavaScript, NodeJS)  (0) 2022.01.10
[백준] 10866번: 덱 (JavaScript, NodeJS)  (0) 2022.01.10
[백준] 18258번: 큐 2 (JavaScript, NodeJS)  (0) 2022.01.09
    정현수
    정현수
    깃허브 : https://github.com/junghyeonsu 개인 블로그 : https://junghyeonsu.com/ (양질의 글을 올리려고 항상 노력합니다.)

    티스토리툴바