이번 글은 전북대학교 프로그래밍 대회에서 나온 백준 알고리즘 15815번 천재 수학자 성필 C++ 문제입니다.
1. 문제
평행 세계의 성필은 숫자와 연산자를 만든 당대 최고의 수학자이다. 그리고 놀랍게도 이 숫자와 연산자는 현재 우리가 사용하는 것과 같다. 하지만 수식은 연산자가 피연산자 가운데 위치하는 우리와는 다르게 연산자가 피연산자 뒤에 위치한다고 한다.
우리 세계의 식을 성필의 식으로 바꾸는 방법을 간단히 설명하자면 이렇다. 우선 주어진 식을 연산자의 우선순위에 따라 괄호로 묶어준다. 그런 다음에 괄호 안의 연산자를 괄호의 오른쪽으로 옮겨주면 된다.
예를 들어 a+b*c는 (a+(b*c))의 식과 같게 된다. 그다음에 안에 있는 괄호의 연산자 *를 괄호 밖으로 꺼내게 되면 a+bc*가 된다. 마지막으로 또 +를 괄호의 오른쪽으로 고치면 abc*+가 되게 된다.
천재 수학자 성필은 자신이 만든 이런 간단한 식조차 1초 안에 계산하지 못하는 사람들을 위하여 답을 구해주는 프로그램을 개발하려고 했지만 아쉽게도 성필의 세계에는 프로그래밍 언어가 없다. 프로그래밍을 할 수 있는 우리가 성필을 위해 평행세계의 식을 계산하는 프로그램을 만들어주자.
2. 입력
길이가 100이 넘지 않는 수식이 예제 입력과 같이 공백 없이 입력된다. 수식은 0부터 9까지의 숫자와 연산자 '+', '-', '*', '/' 로만 이루어져 있다.
또한, 수식의 계산 중간 과정의 모든 결과는 항상 2,147,483,647을 넘지 않는 정수이고 0으로 나누는 경우는 없습니다.
잘못된 수식이 입력되는 경우도 없습니다.
123*+
3. 출력
입력으로 주어진 성필의 수식의 답을 첫째 줄에 출력한다.
7
4. 풀이
이 문제는 후위표기법에 대한 문제입니다.
후위표기법은 위의 예제 입출력과 같이 1+(2*3)이 있으면, 연산자를 뒤로 보내는 방식이다.
1+(2*3) -> 1+(23*) ->123*+ 이런 형식으로 변형된다.
그래서 계산을 하려면, 스택 1개를 사용했는데 입력받은 값이 숫자면 스택에 저장하고 아니면 계산하는 방법이다.
123이 스택에 저장이 되고 나서, 연산자를 만나면 a와 b에 스택값을 저장하여 계산하는 방법을 반복한다.
5. 소스 코드
#include
#include
#include
#include
using namespace std;
void calc(char s);
char S[101];
stack stk;
int main()
{
cin >> S;
for(int i=0;i<strlen(S);i++)
{
if(isdigit(S[i]))
{
stk.push(S[i]-'0');
}
else
{
calc(S[i]);
}
}
cout << stk.top();
}
void calc(char s)
{
int b = stk.top();
stk.pop();
int a = stk.top();
stk.pop();
switch(s)
{
case '+':
stk.push(a+b);
break;
case '-':
stk.push(a-b);
break;
case '*':
stk.push(a*b);
break;
case '/':
stk.push(a/b);
break;
}
}
6. 결과
'알고리즘 > 백준 알고리즘' 카테고리의 다른 글
[백준 알고리즘/BOJ] 2753번 윤년(C++) (0) | 2019.07.11 |
---|---|
[백준 알고리즘/BOJ] 1330번 두 수 비교하기(C++) (0) | 2019.07.10 |
[백준 알고리즘/BOJ] 2588번 곱셈(C++) (0) | 2019.07.09 |
[백준 알고리즘/BOJ] 10171번 고양이 (2) | 2019.07.05 |
[백준 알고리즘/BOJ] 15813번 너의 이름은 몇 점이니?(C++) (0) | 2019.05.17 |
[백준 알고리즘/BOJ] 15814번 야바위대장(C++) (2) | 2019.05.16 |
[백준 알고리즘/BOJ] 14624번 전북대학교(C언어) (0) | 2019.05.12 |
[백준 알고리즘/BOJ] 2525번 오븐시계(C언어) (0) | 2019.05.11 |
최근댓글