[SW Expert Academy, SWEA 1232] 사칙연산 (java)
Problem Solving/SWEA

[SW Expert Academy, SWEA 1232] 사칙연산 (java)

728x90

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV141J8KAIcCFAYD&categoryId=AV141J8KAIcCFAYD&categoryType=CODE&problemTitle=%EC%82%AC%EC%B9%99%EC%97%B0%EC%82%B0&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=&pageSize=10&pageIndex=1

 

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