본문 바로가기

Algorithm

1232. [S/W 문제해결 기본] 9일차 - 사칙연산

반응형

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV141J8KAIcCFAYD&categoryId=AV141J8KAIcCFAYD&categoryType=CODE

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

서브트리를 생각하면서 노드 배치가 어떻게 되는지 생각하면

(숫자가 없다면 무조건 자식노드 2개를 가짐.)

재귀를 이용해 풀수 있는 문제!

#include<iostream>
#include<string.h>
#include<queue>
using namespace std;

int N;

struct Node {

	int left;
	int right;
	int num;
	char c;
};
Node node[1001];
bool visit[1001];
double result;

double Cal(int idx)
{	
	if (node[idx].num)
	{
		return node[idx].num;
	}
	else
	{
		if (node[idx].c == '+')
		{
			return (double)Cal(node[idx].left) + (double)Cal(node[idx].right);
		}
		else if (node[idx].c == '-')
		{
			return (double)Cal(node[idx].left) - (double)Cal(node[idx].right);
		}
		else if (node[idx].c == '*')
		{
			return (double)Cal(node[idx].left) * (double)Cal(node[idx].right);
		}
		else if (node[idx].c == '/')
		{
			return (double)Cal(node[idx].left) / (double)Cal(node[idx].right);
		}
		
	}
}

int main(int argc, char** argv)
{
	int test_case;


	
	/*
	   여러 개의 테스트 케이스가 주어지므로, 각각을 처리합니다.
	*/
	for (test_case = 1; test_case <= 10; ++test_case)
	{
		cin >> N;
        memset(node,0,sizeof(node));
		for (int i = 0; i < N; i++)
		{
			int idx;
			cin >> idx;

			string c;
			cin >> c;


			if (c == "+" || c == "-" || c == "*" || c == "/")
			{
				node[idx].c = c[0];
				int left, right;
				cin >> left >> right;
				node[idx].left = left;
				node[idx].right = right;
			}
			else
			{
				int num = 0;
				int z = 1;
				for (int j = c.size() - 1; j >= 0; j--)
				{
					num += z * (c[j] - '0');
					z *= 10;
				}
				node[idx].num = num;
			}
		}
		
		cout << "#" << test_case << " " << Cal(1) << endl;



	}
	return 0;//정상종료시 반드시 0을 리턴해야합니다.
}
반응형

'Algorithm' 카테고리의 다른 글

백준 12865번 평범한 배낭 oo  (0) 2020.07.05
7733. 치즈 도둑  (0) 2020.06.05
3074. 입국심사  (0) 2020.06.03
백준 2206번 벽 부수고 이동하기  (0) 2020.06.01
백준 1600번 말이 되고픈 원숭이  (0) 2020.06.01