본문 바로가기
Data science/알고리즘 학습

SWEA 1232 : 사칙연산[D4] (C++)

by ggoboogi_house 2022. 3. 28.
반응형

** 문제 풀이 방법

- 처음 들어오는 값이 숫자인지 문자(연산자)인지 판별 후 재귀적으로 연산

 

*** 코드

#include <stdio.h>
#define MAX_N 1001

using namespace std;

struct tree {
	bool is_num;
	int num;
	int child_node[2];

}tree[MAX_N];

double calculation(int idx) {
	if (tree[idx].is_num) {
		return (double)tree[idx].num;
	}
	else {
		double c1 = calculation(tree[idx].child_node[0]);
		double c2 = calculation(tree[idx].child_node[1]);
		
		switch (tree[idx].num){
		case '+': return c1 + c2;
		case '-': return c1 - c2;
		case '*': return c1 * c2;
		case '/': return c1 / c2;
		}
	}

	return -1;
}

int main() {
	//freopen("input.txt", "r", stdin);
	int TC = 10;

	for (int tc = 1; tc <= TC; tc++) {
		int N = 0;
		scanf("%d", &N);

		for (int i = 1; i <= N; i++) {
			int idx = 0;
			scanf("%d", &idx);
			char value[10];
			scanf("%s", &value);

			if (value[0] >= '0' && value[0] <= '9') {	// 숫자일 경우
				tree[idx].is_num = true;
				int num = 0;
				for (int i = 0; value[i]; i++) {	// string 배열의 마지막 값은 '0'이므로 그 전까지 순회
					num *= 10;
					num += value[i] - '0';		// char형 숫자에서 숫자값 추출
				}
				tree[idx].num = num;
			}
			else {
				tree[idx].is_num = false;
				int num = value[0];
				int c1 = 0;
				int c2 = 0;
				scanf("%d %d", &c1, &c2);
				tree[idx].num = num;
				tree[idx].child_node[0] = c1;
				tree[idx].child_node[1] = c2;
			}			
		}

		printf("#%d %.0lf\n", tc, calculation(1));
	}

	return 0;
}

 

**** 주의할 점

- Tree의 index 주의
- 문자형태의 숫자를 변환하는 것 빼먹지 않기

 

 

<Reference>

- https://swexpertacademy.com/main/main.do 

- https://blog.uniony.me/swea/1232/

 

반응형