- ๋ฌธ์
์์์ ์ผ๋ฐ์ ์ผ๋ก 3๊ฐ์ง ํ๊ธฐ๋ฒ์ผ๋ก ํํํ ์ ์๋ค. ์ฐ์ฐ์๊ฐ ํผ์ฐ์ฐ์ ๊ฐ์ด๋ฐ ์์นํ๋ ์ค์ ํ๊ธฐ๋ฒ(์ผ๋ฐ์ ์ผ๋ก ์ฐ๋ฆฌ๊ฐ ์ฐ๋ ๋ฐฉ๋ฒ์ด๋ค), ์ฐ์ฐ์๊ฐ ํผ์ฐ์ฐ์ ์์ ์์นํ๋ ์ ์ ํ๊ธฐ๋ฒ(prefix notation), ์ฐ์ฐ์๊ฐ ํผ์ฐ์ฐ์ ๋ค์ ์์นํ๋ ํ์ ํ๊ธฐ๋ฒ(postfix notation)์ด ๊ทธ๊ฒ์ด๋ค. ์๋ฅผ ๋ค์ด ์ค์ ํ๊ธฐ๋ฒ์ผ๋ก ํํ๋ a+b๋ ์ ์ ํ๊ธฐ๋ฒ์ผ๋ก๋ +ab์ด๊ณ , ํ์ ํ๊ธฐ๋ฒ์ผ๋ก๋ ab+๊ฐ ๋๋ค.
์ด ๋ฌธ์ ์์ ์ฐ๋ฆฌ๊ฐ ๋ค๋ฃฐ ํ๊ธฐ๋ฒ์ ํ์ ํ๊ธฐ๋ฒ์ด๋ค. ํ์ ํ๊ธฐ๋ฒ์ ์์์ ๋งํ ๋ฒ๊ณผ ๊ฐ์ด ์ฐ์ฐ์๊ฐ ํผ์ฐ์ฐ์ ๋ค์ ์์นํ๋ ๋ฐฉ๋ฒ์ด๋ค. ์ด ๋ฐฉ๋ฒ์ ์ฅ์ ์ ๋ค์๊ณผ ๊ฐ๋ค. ์ฐ๋ฆฌ๊ฐ ํํ ์ฐ๋ ์ค์ ํ๊ธฐ์ ๊ฐ์ ๊ฒฝ์ฐ์๋ ๋ง์ ๊ณผ ๊ณฑ์ ์ ์ฐ์ ์์์ ์ฐจ์ด๊ฐ ์์ด ์ผ์ชฝ๋ถํฐ ์ฐจ๋ก๋ก ๊ณ์ฐํ ์ ์์ง๋ง ํ์ ํ๊ธฐ์์ ์ฌ์ฉํ๋ฉด ์์๋ฅผ ์ ์ ํ ์กฐ์ ํ์ฌ ์์๋ฅผ ์ ํด์ค ์ ์๋ค. ๋ํ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ๊ดํธ ๋ฑ๋ ํ์ ์๊ฒ ๋๋ค. ์๋ฅผ ๋ค์ด a+b*c๋ฅผ ํ์ ํ๊ธฐ์์ผ๋ก ๋ฐ๊พธ๋ฉด abc*+๊ฐ ๋๋ค.
์ค์ ํ๊ธฐ์์ ํ์ ํ๊ธฐ์์ผ๋ก ๋ฐ๊พธ๋ ๋ฐฉ๋ฒ์ ๊ฐ๋จํ ์ค๋ช ํ๋ฉด ์ด๋ ๋ค. ์ฐ์ ์ฃผ์ด์ง ์ค์ ํ๊ธฐ์์ ์ฐ์ฐ์์ ์ฐ์ ์์์ ๋ฐ๋ผ ๊ดํธ๋ก ๋ฌถ์ด์ค๋ค. ๊ทธ๋ฐ ๋ค์์ ๊ดํธ ์์ ์ฐ์ฐ์๋ฅผ ๊ดํธ์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ฎ๊ฒจ์ฃผ๋ฉด ๋๋ค.
์๋ฅผ ๋ค์ด a+b*c๋ (a+(b*c))์ ์๊ณผ ๊ฐ๊ฒ ๋๋ค. ๊ทธ ๋ค์์ ์์ ์๋ ๊ดํธ์ ์ฐ์ฐ์ *๋ฅผ ๊ดํธ ๋ฐ์ผ๋ก ๊บผ๋ด๊ฒ ๋๋ฉด (a+bc*)๊ฐ ๋๋ค. ๋ง์ง๋ง์ผ๋ก ๋ +๋ฅผ ๊ดํธ์ ์ค๋ฅธ์ชฝ์ผ๋ก ๊ณ ์น๋ฉด abc*+๊ฐ ๋๊ฒ ๋๋ค.
๋ค๋ฅธ ์๋ฅผ ๋ค์ด ๊ทธ๋ฆผ์ผ๋ก ํํํ๋ฉด A+B*C-D/E๋ฅผ ์์ ํ๊ฒ ๊ดํธ๋ก ๋ฌถ๊ณ ์ฐ์ฐ์๋ฅผ ์ด๋์ํฌ ์ฅ์๋ฅผ ํ์ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋๋ค.
์ด๋ฌํ ์ฌ์ค์ ์๊ณ ์ค์ ํ๊ธฐ์์ด ์ฃผ์ด์ก์ ๋ ํ์ ํ๊ธฐ์์ผ๋ก ๊ณ ์น๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค
- ์ฝ๋
#include <iostream>
#include <stack>
#include <map>
using namespace std;
int main()
{
char str[500]; // ๋ฌธ์์ด ๋ฐ์ ๋ฐฐ์ด
stack<char>s;
//๊ฐ ๊ธฐํธ์ ๋ํ ์ฐ์ ์์ ๋งคํ
map<char, int> m;
m['('] = m[')'] = 0;
m['*'] = m['/'] = 1;
m['+'] = m['-'] = 2;
//์
๋ ฅ
cin.getline(str, 501);
for (int i = 0; str[i] != '\0'; i++) { //๋ฌธ์ฅ์ ๋์ ๋๋ฌํ ๋๊น์ง ๋ฐ๋ณต
if (str[i] == '(' || str[i] == ')' || str[i] == '*' || str[i] == '/' || str[i] == '+' || str[i] == '-') {
//๊ธฐํธ๋ผ๋ฉด
if (s.empty()|| m[s.top()] > m[str[i]]) {
//์คํ์ด ๋น์ด์๊ฑฐ๋ ์ฐ์ ์์๊ฐ ๋์ ์ ๋ค์ด ๋ค์ด์ฌ ๊ฒฝ์ฐ
if (str[i] != ')') { //๋ซํ ๊ดํธ๊ฐ ์๋ ๊ฒฝ์ฐ๋ง ์ฝ์
s.push(str[i]);
}
else {
//๋ซํ ๊ดํธ๋ผ๋ฉด ( ๋ง๋ ๋ ๊น์ง ์ถ๋ ฅ
while (s.top() != '(') {
cout << s.top();
s.pop();
}
s.pop(); // ( ๋ ์ ๊ฑฐ
}
}
else {
//์คํ์ด ๋น์ด์์ง ์๊ณ ์ฐ์ ์์๊ฐ ๊ฐ๊ฑฐ๋ ๋ฎ์ ์ ๋ค์ด ๋ค์ด์ฌ ๊ฒฝ์ฐ
if (str[i] == ')') { // ๋ซํ ๊ดํธ์ผ ๊ฒฝ์ฐ ๋ฌด์กฐ๊ฑด ์ฐ์ ์์๊ฐ ๊ฐ์ ( ์ผ ์ ๋ฐ์ ์์ผ๋ฏ๋ก
s.pop(); // ( ์ ๊ฑฐ
}
else {
//๋ซํ ๊ดํธ๊ฐ ์๋ ๊ฒฝ์ฐ ์ฐ์ ์์๊ฐ ์คํ์ top ์์๋ณด๋ค ๋์์ง๊ฑฐ๋ ์คํ์ด ๋น ๋๊น์ง ์ถ๋ ฅ
while (!s.empty() && (m[s.top()] <= m[str[i]])) {
if (s.top() == '(') { // ( ๊ทธ๋ฅ ๋ฌด์
break;
}
cout << s.top();
s.pop();
}
s.push(str[i]); // ์๋ก ๋ค์ด์จ ๊ธฐํธ ์คํ์ ์ฝ์
}
}
}
else { //๋ฌธ์๋ผ๋ฉด ๊ทธ๋ฅ ์ถ๋ ฅ
cout<<str[i];
}
}
while (!s.empty()) { // ์คํ์ ๋จ์์๋ ๊ธฐํธ ์ถ๋ ฅ
cout << s.top();
s.pop();
}
return 0;
}
- ํด์ค
1. main ํจ์
: ๋ฌธ์์ด ๋ฐ์ ๋ฐฐ์ด๊ณผ ์คํ์ ์ ์ธ
: ๊ฐ ๊ธฐํธ์ ๋ํ ์ฐ์ ์์๋ฅผ ๋งคํ
: cin.getline(str,501)์ ํตํด ํ ์ค์ ์ ๋ ฅ ๋ฐ์
: for๋ฌธ์ ํตํด ๋ฌธ์ฅ์ ๋์ ๋๋ฌํ ๋๊น์ง ํ์ ํ๊ธฐ๋ฒ ์ฐ์ฐ์ ๋ฐ๋ณต
: ๋ง์ฝ ๊ธฐํธ์ ํด๋นํ๋ค๋ฉด
- ์คํ์ด ๋น์ด์๊ฑฐ๋ ์ฐ์ ์์๊ฐ ๋์ ์ ๋ค์ด ๋ค์ด์ค๋ ๊ฒฝ์ฐ (์ฆ, ๋งคํ๋ ์ซ์๊ฐ ์์ ์ ๋ค์ด ๋ค์ด์ค๋ ๊ฒฝ์ฐ)
: ๋ซํ ๊ดํธ๊ฐ ์๋ ๊ฒฝ์ฐ์๋ง ์คํ์ ์ฝ์
: ๋ง์ฝ ๋ซํ ๊ดํธ๋ผ๋ฉด '('์ ๋ง๋ ๋๊น์ง ์คํ์ ์๋ ๊ธฐํธ๋ค ์ถ๋ ฅ ํ '(' ๋ ์ ๊ฑฐ
- ์คํ์ด ๋น์ด์์ง ์๊ณ ์ฐ์ ์์๊ฐ ๊ฐ๊ฑฐ๋ ๋ฎ์ ์ ๋ค์ด ๋ค์ด์ฌ ๊ฒฝ์ฐ (์ฆ, ๋งคํ๋ ์ซ์๊ฐ ๊ฐ๊ฑฐ๋ ํฐ ์ ๋ค์ด ๋ค์ด์ค๋ ๊ฒฝ์ฐ)
: ')' ์ผ ๊ฒฝ์ฐ ๋ฌด์กฐ๊ฑด ์ฐ์ ์์๊ฐ ๊ฐ์ '('์ผ ์ ๋ฐ์ ์์ผ๋ฏ๋ก '(' ์ ๊ฑฐ
: ๋ซํ ๊ดํธ๊ฐ ์๋ ๊ฒฝ์ฐ ์ฐ์ ์์๊ฐ ์คํ์ top ์์๋ณด๋ค ๋์์ง๊ฑฐ๋ (์ฆ, ๋งคํ๋ ์ซ์๊ฐ ์์์ง๊ฑฐ๋) ์คํ์ด ๋น ๋๊น์ง ์ถ๋ ฅ. ์ด ๋, '('๋ ์ถ๋ ฅํ์ง ์๊ณ while๋ฌธ์ ๋ฒ์ด๋๋๋ก ํจ. ๊ทธ๋ฆฌ๊ณ ์๋ก ๋ค์ด์จ ๊ธฐํธ๋ ์คํ์ ์ฝ์
: ๋ฌธ์๋ผ๋ฉด ๊ทธ๋ฅ ์ถ๋ ฅ
: ๋ง์ง๋ง์ผ๋ก ์คํ์ ๋จ์์๋ ๊ธฐํธ ๋ชจ๋ ์ถ๋ ฅ