GitHubSeob

C++ / 백준 / 1935 / 후위 표기식2 본문

Baekjoon/Silver

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

GitHubSeob 2022. 3. 13.

문제

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

 

1935번: 후위 표기식2

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

www.acmicpc.net

문제풀이

입력을 다 받고 나서 A~Z까지 입력받은 문자를 해당하는 값으로 먼저 치환을 한다.

vector<string>을 선언하고 문자는 해당하는 숫자 형태로, 연산자는 연산자 그대로 입력한다.

그다음 idx는 숫자, idx+1는 숫자, idx+2는 연산자인 경우를 for문을 돌려 값을 찾은 후,

해당 연산자로 연산을 한 후 결과를 idx번째에 집어넣고 idx+1, idx+2의 위치한 값들을 erase로 지운다.

그다음 idx를 0부터 다시 반복하게 하고, 벡터의 크기가 2 이하라면 그만 반복하도록 한다.

마지막으로 fixed, precision을 통해 소수점 두 자리까지 출력한다.

 

	for (idx = 0; idx < N; ++idx) {
		for (int idx2(0); idx2 < input.size(); ++idx2) {
			if (input[idx2] >= 'A' && input[idx2] <= 'Z') {
				if (idx + 'A' == input[idx2])
					arr_input[idx2] = to_string(num[idx]);
			}
			else arr_input[idx2] = input[idx2];
		}
	}

A부터 Z문자를 입력받은 값으로 치환하는 부분이다.

A부터 Z문자가 아닌 연산자라면 그대로 집어넣는다.

 

	while (arr_input.size() >= 3) {
		for (idx = 0; idx + 2 < arr_input.size(); ++idx) {
			if (arr_input[idx] != "+" && arr_input[idx] != "-" && arr_input[idx] != "*" && arr_input[idx] != "/") {
				if (arr_input[idx + 1] != "+" && arr_input[idx + 1] != "-" && arr_input[idx + 1] != "*" && arr_input[idx + 1] != "/") {
					if (arr_input[idx + 2] == "+")
						number = stod(arr_input[idx]) + stod(arr_input[idx + 1]);

					else if (arr_input[idx + 2] == "-")
						number = stod(arr_input[idx]) - stod(arr_input[idx + 1]);

					else if (arr_input[idx + 2] == "*")
						number = stod(arr_input[idx]) * stod(arr_input[idx + 1]);

					else if (arr_input[idx + 2] == "/")
						number = stod(arr_input[idx]) / stod(arr_input[idx + 1]);

					else continue;

					arr_input[idx] = to_string(number);
					arr_input.erase(arr_input.begin() + idx + 1);
					arr_input.erase(arr_input.begin() + idx + 1);
					idx = -1;
				}
			}
		}
	}

idx가 숫자, idx+1가 숫자, idx+2가 연산자인 경우를 if문으로 구현했다.

 

연산을 끝나면 idx에 집어넣고 idx+1, idx+2를 지운다.

erase idx+1을 하면 한 칸씩 왼쪽으로 당겨지므로 처음의 idx+2가 idx+1의 위치로 가므로 또 erase idx+1을 한다.

 

코드

#include <iostream>
#include <vector>
#include <string>
using namespace std;

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);

	int N(0), idx(0);
	cin >> N;

	string input("");
	cin >> input;

	vector<string>arr_input(input.size(), "");
	vector<double>num(N, 0);

	for (idx = 0; idx < N; ++idx)
		cin >> num[idx];

	for (idx = 0; idx < N; ++idx) {
		for (int idx2(0); idx2 < input.size(); ++idx2) {
			if (input[idx2] >= 'A' && input[idx2] <= 'Z') {
				if (idx + 'A' == input[idx2])
					arr_input[idx2] = to_string(num[idx]);
			}
			else arr_input[idx2] = input[idx2];
		}
	}
	double number(0);
	while (arr_input.size() >= 3) {
		for (idx = 0; idx + 2 < arr_input.size(); ++idx) {
			if (arr_input[idx] != "+" && arr_input[idx] != "-" && arr_input[idx] != "*" && arr_input[idx] != "/") {
				if (arr_input[idx + 1] != "+" && arr_input[idx + 1] != "-" && arr_input[idx + 1] != "*" && arr_input[idx + 1] != "/") {
					if (arr_input[idx + 2] == "+")
						number = stod(arr_input[idx]) + stod(arr_input[idx + 1]);

					else if (arr_input[idx + 2] == "-")
						number = stod(arr_input[idx]) - stod(arr_input[idx + 1]);

					else if (arr_input[idx + 2] == "*")
						number = stod(arr_input[idx]) * stod(arr_input[idx + 1]);

					else if (arr_input[idx + 2] == "/")
						number = stod(arr_input[idx]) / stod(arr_input[idx + 1]);

					else continue;

					arr_input[idx] = to_string(number);
					arr_input.erase(arr_input.begin() + idx + 1);
					arr_input.erase(arr_input.begin() + idx + 1);
					idx = -1;
				}
			}
		}
	}
	cout << fixed;
	cout.precision(2);
	cout << stod(arr_input[0]);
}

 

'Baekjoon > Silver' 카테고리의 다른 글

C++ / 백준 / 1874 / 스택 수열  (0) 2022.03.14
C++ / 백준 / 10799 / 쇠막대기  (0) 2022.03.13
C++ / 백준 / 1966 / 프린터 큐  (0) 2022.03.11
C++ / 백준 / 10866 / 덱  (0) 2022.03.07
C++ / 백준 / 2164 / 카드2  (0) 2022.03.07