[백준 BOJ] 1935번 후위 표기식2 (C++/cpp)

2022. 1. 11. 01:47PS (Program Solving)/BOJ (백준)

문제 설명

https://www.acmicpc.net/problem/1935

 

1935번: 후위 표기식2

첫째 줄에 피연산자의 개수(1 ≤ N ≤ 26) 가 주어진다. 그리고 둘째 줄에는 후위 표기식이 주어진다. (여기서 피연산자는 A~Z의 영대문자이며, A부터 순서대로 N개의 영대문자만이 사용되며, 길이

www.acmicpc.net

백준 BOJ 1935번 후위 표기식2 문제 사진

 

백준 BOJ 1935번 후위 표기식2 문제 사진2

 

접근 방법 - 전형적인 스택 응용문제

백준 1935번 문제는 스택의 대표 유형이라 할 수 있는 후위 표기식 문제이다.

필자는 후위식에 있어 변수에 해당하는 문자를 만나면 스택에 푸시하고

연산자를 만나면 스택에 저장되어있는 변수를 꺼내어 연산하는 식으로 코드를 구성하였다.

숫자는 별개의 배열에 저장해둔 뒤, 변수를 대신해 스택에 푸시하도록 하였다.

추가로, 예제들의 정답들이 모두 소수점 2번째 자리까지만 출력이 되어있어 이에 관한 코드도 함께 작성하였다.

필자는 아래의 순서대로 코드를 작성하며 문제를 해결하였다.

 

코드의 실행 순서

1) 결과 출력 시 소수점 두 번째 자리까지만 출력되게끔, 별도의 cout 설정을 한다.

 

2) 숫자 저장하는 스택 선언한 뒤, 테스트 케이스, 후위식, 변수의 숫자 입력받기

 

3) 반복문 통해서 입력받은 후위식 탐색

알파벳 변수 만났을 경우, 각 알파벳 변수에 알맞은 숫자가 저장된 배열 값을 불러와 스택에 푸시

연산자 만났을 경우, 스택의 가장 상단에 있는 2개의 숫자를 꺼내어 해당 연산을 수행한 뒤 이 결괏값을 스택에 푸시

 

4) 연산이 완료되면 스택에 남아있는 최종 결괏값을 출력한 뒤 실행 종료한다.

반응형

 

성공한 코드

#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4996)
#include <iostream>
#include <stack>
#include <string>
using namespace std;

//백준 1935번 코드
int main() {
	cout << fixed;
	cout.precision(2);
	stack<double> s;
	int n;	string ch;	int num[26];
	cin >> n;
	cin >> ch;
	for (int i = 0; i < n; i++) {
		cin >> num[i];
	}

	for (int i = 0; i < ch.length(); i++) {
		if (ch[i] == '+' || ch[i] == '-' || ch[i] == '*' || ch[i] == '/') {
			double a = s.top();	s.pop();
			double b = s.top();	s.pop();
			double result;
			switch (ch[i]) {
			case '+':	result = a + b;	break;
			case '-':	result = b - a;	break;
			case '*':	result = a * b;	break;
			case '/':	result = b / a;	break;
			}
			s.push(result);
		}
		else {
			s.push(num[ch[i]-'A']);
		}
	}
	cout << s.top() << endl;
}

 

제출 결과

백준 BOJ 1935번 후위 표기식2 문제 C++ 제출 결과

(2022.01.01 백준 1935번 제출 결과)

(신년을 실버 문제로 시작하다니, 기특하다...!)

반응형