경험의 기록

문제

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

풀이

0. 문제 해석

2022.02.08 - [알고리즘, 자료구조/SWEA] - [SWEA] 1231. 중위순회 (Java)

 

[SWEA] 1231. 중위순회 (Java)

문제 SW Expert Academy SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요! swexpertacademy.com 풀이 0. 문제 해석 이진트리를 생성하여 중위순회 하는 문제이다. 트리를 생성하는

hanyeop.tistory.com

위 문제와 동일하게 중위 순회를 하면 된다.

 

단, 출력하는 것이 아니고 연산하는 것이기 때문에

자식이 단말 노드일 때, 연산하여 결과값을 저장하는 식으로 중위 순회 하면 해결할 수 있다.

 

위와 같은 트리를 중위 순회 한다면

8 / 3 + 5 * 2 순으로 방문할 것이다.

이때, 자식이 둘다 단말노드 일 때 자신의 연산자로 연산하면 된다.

 

둘다 단말 노드인 경우는 3 + 5 였으므로 그 결과값을 저장해준다.

 

한번 더 진행되면 1 * 2가 남게 되고,

 

결국 결과값이 2가 된다.

 

1. 트리 클래스 메소드 구현, 생성

1231번의 문제와 동일하다.

 

2. 중위 순회 계산

자식이 둘 다 단말 노드 일 때 연산 해준다.

 

3. 전체 코드

// [SWEA] 1232. 사칙연산 (Java)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

// 트리 노드
class Node{
	int index;
	String data;
	Node leftNode;
	Node rightNode;
	
	public Node(int index) {
		this.index = index;
		this.data = " ";
		leftNode = null;
		rightNode = null;
	}
}

// 트리 클래스
class Tree{
	Node root = null;
	
	public void add(int index, String data, int leftIndex, int rightIndex) {
		// 트리 최초 생성 시
		if(root == null) {
			root = new Node(index);
			root.data = data;
			if(leftIndex != 0) root.leftNode = new Node(leftIndex);
			if(rightIndex != 0) root.rightNode = new Node(rightIndex);
		}
		else {
			search(root,index,data,leftIndex,rightIndex);
		}
	}
	
	// 이미 존재하는 노드에 연결
	public void search(Node root, int index, String data, int leftIndex, int rightIndex) {	
		// 찾았을 때 좌우 연결
		if(root.index == index) {
			root.data = data;
			if(leftIndex != 0) root.leftNode = new Node(leftIndex);
			if(rightIndex != 0) root.rightNode = new Node(rightIndex);
		}
		
		// 못 찾으면 좌우 탐색
		else {
			if(root.leftNode != null) search(root.leftNode,index,data,leftIndex,rightIndex);
			if(root.rightNode != null) search(root.rightNode,index,data,leftIndex,rightIndex);
		}
	}
	
	// 중위 순회 (왼쪽 자식, 루트, 오른쪽 자식)
	public double inOrder(Node root) {
		String curData = root.data;
		double left = 0;
		double right = 0;
		double result = 0;
		
		// left 결정 (마지막 레벨에 있는 숫자부터 연산)
		if(root.leftNode.leftNode == null) {
			left = Double.parseDouble(root.leftNode.data);
		}
		else {
			left = inOrder(root.leftNode);
		}
		
		// right 결정 (마지막 레벨에 있는 숫자부터 연산)
		if(root.rightNode.rightNode == null) {
			right = Double.parseDouble(root.rightNode.data);
		}
		else {
			right = inOrder(root.rightNode);
		}

		// 연산
		if(curData.equals("+")) {
			result = left + right;
		}
		else if(curData.equals("-")) {
			result = left - right;
		}
		else if(curData.equals("*")) {
			result = left * right;
		}
		else if(curData.equals("/")) {
			result = left / right;
		}
		return result;
	}
}

public class Solution {
	static int n; // 정점의 총 수
	static Tree tree; // 트리
	
 public static void main(String[] args) throws IOException{
 	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 	
 	for(int t = 1; t <= 10; t++) {
 		n = Integer.parseInt(br.readLine()); 	
		tree = new Tree();
		
 		for(int i = 1; i <= n; i++) {
 			StringTokenizer st = new StringTokenizer(br.readLine());
 			st.nextToken();
 			String data = st.nextToken();
 			int leftIndex = 0;
 			int rightIndex = 0;
 			
 			if (st.countTokens() == 2) {
 				leftIndex = Integer.parseInt(st.nextToken());
 				rightIndex = Integer.parseInt(st.nextToken());
 			}
 			
 			tree.add(i, data, leftIndex, rightIndex);
 		}
 		
 		System.out.println("#" + t + " " + (int)tree.inOrder(tree.root));
 	}
  }
}

 

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading