KimMinJun
Coding Note
KimMinJun
전체 방문자
오늘
어제
  • 분류 전체보기 (487)
    • ALGORITHM (11)
      • 정렬 (6)
      • 최단경로 (1)
      • 자료구조 (1)
      • 슬라이딩 윈도우 (1)
      • etc (2)
    • Git (5)
    • Web (24)
      • Vanilla JS (13)
      • TS (2)
      • React (7)
      • ETC (1)
    • React 공식문서 (번역, 공부) (11)
      • Quick Start (2)
      • Installation (0)
      • Describing the UI (9)
      • Adding Interactivity (0)
      • Managing State (0)
      • Escape Hatches (0)
    • Next.js 공식문서 (번역, 공부) (3)
      • Getting Started (2)
      • Building Your Application (1)
    • PS (432)
      • 백준 (187)
      • Programmers (105)
      • CodeUp (21)
      • STL (3)
      • 제코베 JS 100제 (50)
      • SWEA (0)
      • LeetCode (65)
    • IT (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • 관리

공지사항

인기 글

태그

  • 수학
  • C++
  • 정렬
  • Level 0
  • string
  • Level1
  • LeetCode
  • 그래프
  • js
  • Level 2
  • 다이나믹 프로그래밍
  • 문자열
  • 제코베 JS 100제
  • C
  • Level 1
  • 백준
  • codeup
  • programmers
  • recursion
  • tree

최근 댓글

최근 글

hELLO · Designed By 정상우.
KimMinJun

Coding Note

PS/백준

백준 / 스택 / 1935번 / 후위 표기식 2 / C++

2021. 7. 24. 18:34

문제

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

입력

첫째 줄에 피연산자의 개수(1 ≤ N ≤ 26) 가 주어진다. 그리고 둘째 줄에는 후위 표기식이 주어진다.

(여기서 피연산자는 A~Z의 영대문자이며, A부터 순서대로 N개의 영대문자만이 사용되며, 길이는 100을 넘지 않는다)

그리고 셋째 줄부터 N+2번째 줄까지는 각 피연산자에 대응하는 값이 주어진다.

(3번째 줄에는 A에 해당하는 값, 4번째 줄에는 B에 해당하는값 , 5번째 줄에는 C ...이 주어진다,

그리고 피연산자에 대응 하는 값은 정수이다)

출력

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

예제 입력 1 

5

ABC*+DE/-

1

2

3

4

5

예제 출력 1 

6.20

예제 입력 2 

1

AA+A+

1

예제 출력 2 

3.00

 

#include <iostream>
#include <stack>
using namespace std;

int main() {
	int n;
	int alphaArr[26] = { 0, };
	double result = 0;
	string str;
	stack<double> s;

	cin >> n;
	cin >> str;

	for (int i = 0; i < n; i++) {
		int num;
		cin >> num;
		alphaArr[i] = num;
	}

	int len = str.length();

	for (int i = 0; i < len; i++) {
		if (str[i] >= 'A' && str[i] <= 'Z') {
			s.push(alphaArr[str[i] - 'A']);
		}
		else {
			double prev;
			double current;

			current = s.top();
			s.pop();
			prev = s.top();
			s.pop();

			switch (str[i]) {
			case '+': 
				result = prev + current;
				break;
			case '-': 
				result = prev - current;
				break;
			case '*': 
				result = prev * current;
				break;
			case '/': 
				result = prev / current;
				break;
			}

			s.push(result);
		}
	}

	cout << fixed;
	cout.precision(2);
	cout << result << endl;

	return 0;
}

입력받은 문자열에서 알파벳은 그 다음에 입력받게 될 숫자들의 순서들을 의미한다.

따라서 입력받은 숫자들은 따로 배열에 넣어준다.

 

그리고 문자열의 처음부터 끝까지 반복문을 돌면서 문자가 알파벳일시 배열에서 그 알파벳을 찾아서

스택에 push 해준다.

여기서 찾는 방법은, 만약 ABC라는 문자열이 있고, ABC가 4,5,6이라고 하면 일단 4,5,6을 위에 말한대로

저장하게 될 것이다.

그러면 배열에서 4,5,6의 index는 각각 0,1,2가 될것이다.(입력받은 순서대로)

그리고 입력받은 문자열로 반복문을 돌게 될텐데, 여기서 문자열의 처음인 A에서 'A'를 빼주면 0이 될것이다.

B에서 'A'를 빼주면 1, C에서 빼주면 2가 될것이다. (아스키 연산이다)

그러면 결국 배열에서 알파벳에 해당하는 값의 인덱스와 같아질 것 이다.

그거를 스택에 push 해주는것이다.

 

만약 스택이 알파벳이아니라 연산자인경우는, 스택에서 두개의 수를 뽑아서 연산을 해주고 다시 스택에 넣어준다.

이 과정을 스택이 빌때까지 해주면 결국 마지막은 원하는 결과일것이다.

 

 

저작자표시 (새창열림)

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

백준 / 문자열 / 10820번 / 문자열 분석 / C++  (0) 2021.07.26
백준 / 스택 / 1918번 / 후위 표기식 / C++  (0) 2021.07.26
백준 / 스택 / 10799번 / 쇠막대기 / C++  (0) 2021.07.23
백준 / 스택 / 17413번 / 단어 뒤집기 2 / C++  (0) 2021.07.23
    'PS/백준' 카테고리의 다른 글
    • 백준 / 문자열 / 10820번 / 문자열 분석 / C++
    • 백준 / 스택 / 1918번 / 후위 표기식 / C++
    • 백준 / 스택 / 10799번 / 쇠막대기 / C++
    • 백준 / 스택 / 17413번 / 단어 뒤집기 2 / C++
    KimMinJun
    KimMinJun

    티스토리툴바