본문 바로가기

자료구조/SW Expert Academy

1232 - 사칙연산

단, 조항을 잘읽어야하는 문제이다. 중간 과정에서 연산을 실수연산으로 하고 최종결과값만 정수부를 출력해야한다. 테스트 케이스 중에 1 / 0.5 같은 연산도 존재하기 때문에 이 예외를 처리하지 않으면 Divided by Zero 런타임 에러가 발생할 수 있다.

 

그리고 입력이 굉장히 까다로웠다. cin으로 사용하기 위해서는 getline함수이나 그냥 cin을 이용해서 한줄을 모두 받아들이는 방법이 좋고, 나는 printf와 getchar를 이용해서 적절하게 버퍼에 데이터를 순차적으로 읽어들였다.

 

그리고 Stack을 활용했을 때 굉장히 주의해야할 점을 무시해서 스택 top index가 계속 -1보다 작은 경우가 발생하는 에러를 핸들링하지 못해서 고생했다.

 

Class는 다양한 대입연산, 복사생성자등 많은 연산을 지원하지만 구조체는 유일하게 대입연산을 지원한다.

 => 구조체는 함수에서 인자로 많이 넘겨지고 Return값으로도 많이 쓰이기 때문이다. Cally by value를 지원하기 위해 사용된다.

 

후위연산을 할때 굳이 Stack을 사용할 필요없이 계산값을 return하여 계산할 수 있다.

 

#include <iostream>

using namespace std;

enum child { DATA = 0, LEFT = 1, RIGHT = 2 };

bool isOp[256]{ 0, };
int  stack[1001]{ 0, };
int top = -1;

int arr[1000][3]{ 0, };

void postOrder(int node) {
	if (arr[node][DATA] == 0) return;
	postOrder(arr[node][LEFT]);
	postOrder(arr[node][RIGHT]);
	if (arr[node][LEFT] != 0 && arr[node][RIGHT] != 0) {
		if (top < 1) {
			cout << endl;
		}
		switch (arr[node][DATA]) {
		case '-':
			stack[top - 1] = stack[top - 1] - stack[top];
			break;
		case '+':
			stack[top - 1] = stack[top - 1] + stack[top];
			break;
		case '*':
			stack[top - 1] = stack[top - 1] * stack[top];
			break;
		case '/':
			if (stack[top] == 0) {
				cout << endl;
			}
			stack[top - 1] = stack[top - 1] / stack[top];
			break;
		}
		top--;
	}
	else {
		stack[++top] = arr[node][DATA];
	}
}

int main() {
	//freopen("Text.txt" , "r" , stdin);
	//data, left, right


	isOp['-' ] = true;
	isOp['*' ] = true;
	isOp['+' ] = true;
	isOp['/' ] = true;
	for (int t = 0; t < 10; t++) {
		int nCount;
		scanf("%d", &nCount);
		getchar();
		for (int i = 0; i < nCount; i++) {
			int node_num;
			scanf("%d",&node_num);
			char a= getchar();

			char op;
			op = getchar();
			
			if (isOp[op]) {
				//operator
				int left, right;
				getchar();
				scanf("%d %d", &left, &right);
				char b= getchar();
				
				arr[node_num][DATA] = op;
				arr[node_num][LEFT] = left;
				arr[node_num][RIGHT] = right;

			}
			else {
				op = (op - '0');
				int operand ;
				int sum = op;
				while ((operand = getchar())!= '\n') {
					sum *= 10;
					sum += (operand-'0');
				}
		
				arr[node_num][DATA] = sum;
			}
		}
		postOrder(1);
		cout <<"#"<<t+1<<" "<< stack[top]<< endl;
		fill_n(stack, 1000, 0);
		top = -1;
		for (int k = 0; k < 1000; k++) {
			arr[k][DATA] = 0;
			arr[k][LEFT] = 0;
			arr[k][RIGHT] = 0;
		}
	}
	
	return 0;
}

'자료구조 > SW Expert Academy' 카테고리의 다른 글

1267 - 작업순서  (0) 2021.04.09
2948. 문자열 교집합  (0) 2021.04.08
[SW Expert Academy]1257 - K번째 문자열  (1) 2021.04.06
SW acadeny 1265 달란트2  (0) 2021.03.29
SW academy 1244 최대 상금  (0) 2021.03.25