[SWEA] #1232 사칙연산

KwonSC·2021년 11월 14일
0

SWEA - Java

목록 보기
24/26
post-thumbnail

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


Code

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.StringTokenizer;

class Solution {
    static ArrayList<ArrayList<Integer>> tree;
    static HashMap<Integer, String> alpha;
    public static float preorder(int x) {
        ArrayList<Integer> arr = tree.get(x);
        if (arr.isEmpty()) {
            return Integer.parseInt(alpha.get(x));
        }
        String oper = alpha.get(x);
        float a = preorder(arr.get(0));
        float b = preorder(arr.get(1));
        if (oper.equals("+")) {
            return a + b;
        }
        else if (oper.equals("-")) {
            return a - b;
        }
        else if (oper.equals("*")) {
            return a * b;
        }
        else {
            return a / b;
        }
    }
    public static void main(String args[]) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        for (int testCase = 1; testCase <= 10; testCase++) {
            StringTokenizer st = new StringTokenizer(br.readLine(), "");
            int N = Integer.parseInt(st.nextToken());
            tree = new ArrayList<>();
            tree.add(new ArrayList<>());
            alpha = new HashMap<>();
            for (int i = 0; i < N; i++) {
                st = new StringTokenizer(br.readLine(), " ");
                tree.add(new ArrayList<>());
                int x = Integer.parseInt(st.nextToken());
                String a = st.nextToken();
                alpha.put(x, a);
                while(st.hasMoreTokens()) {
                    int y = Integer.parseInt(st.nextToken());
                    tree.get(x).add(y);
                }
            }
            System.out.printf("#%d %d\n", testCase, (int)preorder(1));
        }
    }
}

Solution

미리 root의 연산자를 알고 자식노드들을 연산을 해야하니 Root - Left - Right 순인 전위순회를 돌면서 연산을 수행한다. 이전 문제에서는 NumberFormatException을 사용했지만 이번 문제는 무조건 유효한 식만 입력되니 arr.isEmpty()를 이용하여 더 쉽게 연산자와 숫자를 판별하였다. arr가 비었다면(자식노드들이 없으니 숫자) 바로 리턴, 비어있는 상태가 아니면 각 연산자에 맞는 연산을해 리턴하고 최종적으로 출력할때는 소숫점을 버려야하니 (int) 캐스팅을 통해 소숫점을 버리고 출력한다.

0개의 댓글