[SWEA] 사칙연산

문제 보러가기

제한사항

이외의 제한사항은 없다.

첫번째 생각

dfs 탐색 방식으로 노드를 탐색하면서 사칙연산을 수행해주도록 한다.

JAVA Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
import java.util.Scanner;

public class Solution {
	static Node[] node;
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		for(int tc=1;tc<=10;tc++) {
			int N = sc.nextInt();
			node = new Node[N];
			for(int i=0; i<N; i++) {
				int num = sc.nextInt();
				String Data = sc.next();
				int left = 0;
				int right = 0;
				if (Data.equals("-") || Data.equals("+") || Data.equals("*") || Data.equals("/")) {
					left = sc.nextInt()-1; right = sc.nextInt()-1;
					node[i] = new Node(num,Data,left,right);
				} else {
					node[i] = new Node(num,Data);
				}
			}
			int ans = go(0);
			System.out.println("#"+tc+" "+ans);
		}
	}
	
	public static int go(int index) {
		if (node[index].left == -1) {
			return Integer.parseInt(node[index].Data);
		}
		node[index].left  = go(node[index].left);
		node[index].right = go(node[index].right);
		switch(node[index].Data) {
			case "+": {
				node[index].Data = (node[index].left+node[index].right)+ "";
				break;
			}
			case "-": {
				node[index].Data = (node[index].left-node[index].right)+ "";
				break;
			}
			case "*": {
				node[index].Data = (node[index].left*node[index].right)+ "";
				break;
			}
			case "/": {
				node[index].Data = (node[index].left/node[index].right)+ "";
				break;
			}
		}
		return Integer.parseInt(node[index].Data);
	}
	
	public static class Node {
		int num;
		String Data;
		int left;
		int right;
		Node(int num,String Data) {
			this.num = num;
			this.Data = Data;
			this.left = -1;
			this.right = -1;
		}
		Node(int num,String Data, int left, int right) {
			this.num = num;
			this.Data = Data;
			this.left = left;
			this.right = right;
		}
	}
}