PS (C, C++)

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

최연재 2023. 2. 3. 11:00

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

 

1935번: 후위 표기식2

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

www.acmicpc.net

C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
	int n, index=0;
	double arr[101];
	char formula[101];
	scanf("%d", &n);
	scanf("%s", &formula);
	int* input = (int*)malloc(sizeof(int) * n);
	for (int i = 0; i < n; i++) scanf("%d", &input[i]);

	for (int i = 0; i < strlen(formula); i++)
	{
		if (formula[i] == '*')
		{
			arr[index - 2] *= arr[index - 1];
			index--;
		}
		else if (formula[i] == '/')
		{
			arr[index - 2] /= arr[index - 1];
			index--;
		}
		else if (formula[i] == '+')
		{
			arr[index - 2] += arr[index - 1];
			index--;
		}
		else if (formula[i] == '-')
		{
			arr[index - 2] -= arr[index - 1];
			index--;
		}
		else 
		{
			arr[index] = input[formula[i]-65];
			index++;
		}
	}

	printf("%.2lf", arr[0]);
	free(inputNumber);
	return 0;
}

C++

#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;

int main()
{
	int n, index=0, input[101];
	double arr[101];
	char str[101];

	cin >> n;
	cin >> str;
	for (int i = 0; i < n; i++) cin >> input[i];
	for (int i = 0; i < strlen(str); i++)
	{

		if (str[i] == '+')
		{
			arr[index - 2] += arr[index - 1];
			index--;
		}
		else if (str[i] == '-')
		{
			arr[index - 2] -= arr[index - 1];
			index--;
		}
		else if (str[i] == '*')
		{
			arr[index - 2] *= arr[index - 1];
			index--;
		}
		else if (str[i] == '/')
		{
			arr[index - 2] /= arr[index - 1];
			index--;
		}
		else
		{
			arr[index] = input[str[i] - 65];
			index++;
		}
	}

	cout << fixed;
	cout.precision(2);
	cout << arr[0];
	return 0;
}

코드 설명

피연산자의 개수 n을 입력받고, 후위표기식을 입력받는다. input 배열에 입력받은 각 피연산자들에 대응되는 값들을 저장해나간다. 후위 표기식의 길이만큼 반복문을 돌면서 연산을 수행한다. 스택을 사용해서 최종결과가 arr[0]에 저장될 수 있게 한다.

 

후위표기식에서 연산자가 아닌 값을 만나면 알파벳이다. arr[]를 스택으로 사용할 것이므로 input[]배열에 저장되어 있는 값을 arr배열에 넣는데, 이때 input[]의 인덱스를 str[i]-65로 설정한다. (A이면 0, B이면 1이 된다.) 값을 넣으면 index를 증가시킨다. 후위표기식에서 연산자를 만나면 적절한 연산을 수행하는데,  가장 마지막으로 들어온 값 arr[index-1]과 그 전에 들어온 값인 arr[index-2]을 이용한다. arr[index-2] 연산자 arr[index-1] 한 결과를  arr[index-2]에 넣어서 arr[index-1]을 pop한 것과 같은 동작을 수행해나간다. 

 

반복문이 끝나면 arr[0]의 값을 조건에 맞게 출력하고 프로그램을 종료한다. 

 

느낀 점

스택에 피연산자를 저장하고 연산 결과를 저장하는 방식을 사용해서 푼 문제다! 스택을 사용하면 된다는 생각을 한 뒤로는 빠르게 풀었다.