GitHubSeob
C++ / 백준 / 1935 / 후위 표기식2 본문
문제
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 |