궤도

[EPPER] 9회 7번 본문

💻 현생/⛓ 알고리즘

[EPPER] 9회 7번

영이오 2020. 10. 7. 21:56

문제

 

 

 


풀이

 

스택을 처음 배울 때 한번쯤 보았을 후위표기법이다.

개념은 어렵지 않았으나, c에서 char 변수를 받을 때 주의해야 할 점을 까먹어서 좀 고생했다. 입력 예를 보면 알겠지만 중간중간 공백이 있다. character 단위로 입력을 받을 때는 공백도 입력으로 처리하기 때문에 입력을 처리할 input 변수와 더불어 공백을 처리할 empty 변수도 필요하다. m을 입력한 뒤 입력한 엔터도 char에 들어가니 저것도 empty 변수로 빼줘야 한다.

 

아무튼 첫번째 입력은 무조건 숫자일테니 char로 받은 숫자를 int로 바꿔서 num1 변수에 저장한다. 그 다음부터 반복문을 돌며 계산한다. 새로운 숫자가 입력된다면 int로 바꿔서 num2 변수에 저장한다. 그 이후에 연산자가 등장하면 해당 연산자에 따라 계산을 하고 그 결과를 num1에 저장한다. 최종 결과도 num1에 들어있을 테니 마지막에 num1을 출력하면 된다.

 

위 예제처럼 연속으로 등장하는 숫자가 2개를 넘지 않으면 이렇게 간단하게 스택없이 구현할 수 있지만, "234*-"(중위표기법으로는 2-3*4) 같은 경우에는 짤없이 스택을 써야 한다.


소스코드

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main() {
	int num1 = 0, num2 = 0;
	char input, empty;
	int m;

	scanf("%d", &m);
	scanf("%c", &empty); //공백 빼줌
	scanf("%c", &input);
	num1 = input - '0'; //첫 숫자 저장
	for (int i = 1; i < m; i++) {
		scanf("%c", &empty); //공백 빼줌
		scanf("%c", &input);
		switch (input) { //op면 계산해서 num1에 저장하고 숫자면 num2에 저장
		case '+':
			num1 += num2;
			break;
		case '-':
			num1 -= num2;
			break;
		case '*':
			num1 *= num2;
			break;
		case '/':
			num1 /= num2;
			break;
		default:
			num2 = input - '0';
			break;
		}
	}
	printf("%d", num1);
}
Comments