문제의 조건이 너무 이해가 안되서 따로 찾아본 문제다..
단순한 규칙에 따라 문자열을 출력하면 되는데, 입력받은 문자열을 첫 번째부터 마지막까지 순회하며 다음과 같이 룰을 적용한다.
현재 문자를 C라 하면
- C가 알파벳이라면 그냥 출력한다.
- C가 *, / 이라면 스택에 남아있는 문자들 중에 자신과 같은 우선순위의 문자들을 모두 pop & 출력한 뒤, C를 push한다.
- C가 +, - 이라면 스택에 남아있는 문자들 중에 자신과 같거나, 높은 순위의 문자들을 모두 pop & 출력한 뒤, C를 push한다.
- C가 ( 이라면 C를 스택에 push한다.
- C가 ) 이라면 (를 만날 때까지 pop & 출력한다.
처음에 우선순위를 어떻게 구현해야 하나 고민했었는데, 우선순위를 적용하는건, 스택에서 pop했을 때, if 분기의 순서로 간단하게 구현할 수 있다.
규칙을 설명하자면 다음과 같다.
- 알파벳은 피연산자를 앞에 출력하는 후위 표기식의 방식을 따르기 때문에 그냥 출력한다.
- *, / 는 +, -보다 우선순위가 높기 때문에 후위 표기식에서 +, -보다 앞에 있어야 한다.
- +, -는 순서대로 연산만 하면 되기 때문에, 스택을 다 비우고 push한다.
- ( 를 push하는 이유는 괄호 밖의 문자보다 높은 우선순위를 갖기 때문에 기억하기 위함이다.
- 4에 따라 후위표기식에 괄호의 내용이 먼저 오도록 ( 만날 때까지 pop하게 된다.
정답코드
더보기
#include <iostream>
#include <stack>
#include <string>
using namespace std;
#define T s.top()
int main()
{
string str;
cin >> str;
stack<char> s;
for (const auto& c : str) {
if (c >= 'A' && c <= 'Z') {
cout << c;
}
else {
if (c == '(') {
s.push(c);
}
else if(c == '*' || c == '/') {
while (!s.empty() && (T == '*' || T == '/')) {
cout << T;
s.pop();
}
s.push(c);
}
else if(c == '+' || c == '-'){
while (!s.empty() && T != '(') {
cout << T;
s.pop();
}
s.push(c);
}
else if (c == ')') {
while (!s.empty() && T != '(') {
cout << T;
s.pop();
}
s.pop();
}
}
}
while (!s.empty()) {
cout << T;
s.pop();
}
return 0;
}
'알고리즘 관련 > BOJ' 카테고리의 다른 글
14503 로봇청소기 (0) | 2021.01.04 |
---|---|
1202 보석 도둑 (0) | 2021.01.04 |
1916 최소비용 구하기 (0) | 2020.12.31 |
11779 최소비용 구하기 2 (0) | 2020.12.31 |
13549 숨바꼭질 3 (0) | 2020.12.30 |