728x90
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
728x90
메모리: 25,804 KB, 시간: 145 ms
사용 알고리즘: 트리
import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Solution { static String[] node; static int[][] child; public static void main(String[] args) throws Exception{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st; StringBuilder answer = new StringBuilder(); int N, n; for (int tc = 1; tc <= 10; tc++) { // N := 정점의 개수 N = Integer.parseInt(br.readLine()); // 노드 정보 node = new String[N + 1]; // 노드의 자식 정보 child = new int[N + 1][2]; // 노드 정보 입력 for (int i = 0; i < N; i++) { st = new StringTokenizer(br.readLine()); n = Integer.parseInt(st.nextToken()); node[n] = st.nextToken(); // node[n]이 연산자라며 자식 노드의 정보를 입력 받음 if(node[n].equals("+") || node[n].equals("-") || node[n].equals("*") || node[n].equals("/")) { child[n][0] = Integer.parseInt(st.nextToken()); child[n][1] = Integer.parseInt(st.nextToken()); } } // 재귀를 통해 연산 후 값 구하기 answer.append("#" + tc + " " + (int)postorder(1) + "\n"); } // 출력 System.out.println(answer); } private static double postorder(int n) { // 리프 노드인 경우, 해당 노드의 값을 리턴 if(child[n][0] == 0) return Double.parseDouble(node[n]); // 리프 노드가 아니라면 해당 노드는 연산자 // 왼쪽 서브 트리, 오른쪽 서브 트리의 결과 값을 해당 연산자로 계산 후 리턴 double left = postorder(child[n][0]); double right = postorder(child[n][1]); if(node[n].equals("+")) return left + right; else if(node[n].equals("-")) return left - right; else if(node[n].equals("*")) return left * right; else return left / right; } }
728x90
'Problem Solving > SWEA' 카테고리의 다른 글
[SW Expert Academy, SWEA 10806] 수 만들기 (java) (0) | 2024.01.20 |
---|---|
[SW Expert Academy, SWEA 1251] [응용문제] 하나로 (java) (0) | 2024.01.17 |
[SW Expert Academy, SWEA 11446] 사탕 가방 (java) (0) | 2023.07.09 |
[SW Expert Academy, SWEA 10507] 영어 공부 (java) (0) | 2023.07.09 |
[SW Expert Academy, SWEA 9843] 촛불 이벤트 (java) (1) | 2023.06.15 |