[SWEA 1232 : JAVA] 사칙연산 / 이진 트리
문제
SWEA의 문제를 무단 복제하는 것은 금지되어 있으므로, 아래 문제 링크를 남깁니다.
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV141J8KAIcCFAYD
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
요약하면, 이진 트리로 구성된 계산식을 계산하라는 문제다.
풀이
해당 문제는 크게 두 가지의 요구사항을 가진다.
- 이진 트리를 구성할 수 있는가?
- 이진 트리를 탐색(순회)할 수 있는가?
필자는 BinaryTree 클래스를 만들어 메서드를 구현하였다.
코드
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Solution { private static BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); private static int T, N; private static StringBuilder ans = new StringBuilder(); public static void main(String[] args) throws IOException { while (T++ < 10) { N = Integer.parseInt(br.readLine()); BinaryTree tree = new BinaryTree(); StringTokenizer st; for (int i = 0; i < N; i++) { st = new StringTokenizer(br.readLine()); int idx = Integer.parseInt(st.nextToken()); String data = st.nextToken(); tree.insert(idx, data); if (isOperator(data.charAt(0))) { int leftChildIdx = Integer.parseInt(st.nextToken()); int rightChildIdx = Integer.parseInt(st.nextToken()); tree.insert(idx, leftChildIdx, rightChildIdx); } } double result = tree.calc(tree.root); ans.append("#").append(T).append(" ").append((int) result).append("\n"); } System.out.println(ans); } private static boolean isOperator(char c) { return (c == '+' || c == '-' || c == '*' || c == '/'); } private static class BinaryTree { Node root; public void insert(int idx, String data) { if (root == null) { root = new Node(idx, data); return; } Node node = find(root, idx); node.data = data; } public void insert(int parentIdx, int leftChildIdx, int rightChildIdx) { Node node = find(root, parentIdx); node.leftChild = new Node(leftChildIdx, ""); node.rightChild = new Node(rightChildIdx, ""); } private Node find(Node head, int idx) { if (head.idx == idx) return head; Node result = null; if (head.leftChild != null) { result = find(head.leftChild, idx); if (result != null) return result; } if (head.rightChild != null) { result = find(head.rightChild, idx); if (result != null) return result; } return result; } public double calc(Node head) { char operator = head.data.charAt(0); double left = (head.leftChild.leftChild == null ? Double.parseDouble(head.leftChild.data) : calc(head.leftChild)); double right = (head.rightChild.rightChild == null ? Double.parseDouble(head.rightChild.data) : calc(head.rightChild)); double result; if (operator == '+') { result = left + right; } else if (operator == '-') { result = left - right; } else if (operator == '*') { result = left * right; } else if (operator == '/') { result = left / right; } else { result = 0; } return result; } private static class Node { int idx; String data; Node leftChild, rightChild; public Node(int idx, String data) { this.idx = idx; this.data = data; leftChild = null; rightChild = null; } } } }
'Algorithm > SWEA' 카테고리의 다른 글
[SWEA 1248 : JAVA] 공통조상 (0) | 2021.09.01 |
---|---|
[SWEA 1242 : JAVA] 암호코드 스캔 (0) | 2021.08.07 |
[SWEA 1231 : JAVA] 중위순회 / 완전 이진 트리 (0) | 2021.07.30 |
댓글
이 글 공유하기
다른 글
-
[SWEA 1248 : JAVA] 공통조상
[SWEA 1248 : JAVA] 공통조상
2021.09.01 -
[SWEA 1242 : JAVA] 암호코드 스캔
[SWEA 1242 : JAVA] 암호코드 스캔
2021.08.07 -
[SWEA 1231 : JAVA] 중위순회 / 완전 이진 트리
[SWEA 1231 : JAVA] 중위순회 / 완전 이진 트리
2021.07.30
댓글을 사용할 수 없습니다.