반응형
서브트리를 생각하면서 노드 배치가 어떻게 되는지 생각하면
(숫자가 없다면 무조건 자식노드 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 |