본문 바로가기

알고리즘

[SWEA] 1233. 사칙연산 유효성 검사 (JAVA)

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV141176AIwCFAYD 

 

SW Expert Academy

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

swexpertacademy.com

[문제]

사칙연산 “+, -, *, /”와 양의 정수로만 구성된 임의의 이진 트리가 주어질 때, 이 식의 유효성을 검사하는 프로그램을 작성하여라.
여기서 말하는 유효성이란, 사칙연산 “+, -, *, /”와 양의 정수로 구성된 임의의 식이 적절한 식인지를 확인하는 것으로, 계산이 가능하다면 “1”, 계산이 불가능할 경우 “0”을 출력한다.

(단, 계산이 가능한지가 아닌 유효성을 검사하는 문제이므로 0으로 나누는 경우는 고려하지 않는다. )

 

[풀이]

연산이 불가능한 경우는 자식 노드가 없는데 노드값이 연산자인 경우이다. 즉, 리프노드일 때 연산자라면 연산이 불가능한 경우이다.

1. answer=1 (연산이 가능한 상태)로 설정

2. 자식노드가 없고, 노드값이 연산자인 경우

3. answer=0으로 설정

package A0208;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;

public class SWEA_사칙연산유효성검사 {
	
	static String[] value;
	static int[][] tree;
	
	private static boolean isOperator(String c) {
	       if (c.equals("+")|| c.equals("-") || c.equals("*") || c.equals("/"))
	    	   return true;
	       return false;
	 }
	
	public static void main(String[] args) throws Exception {
		//System.setIn(new FileInputStream("input_isOK.txt")); 
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int T = 10;

		for(int test_case = 1; test_case <= T; test_case++) {
			int N = Integer.parseInt(br.readLine());
			value = new String[N+1];
			tree = new int[N+1][2];
			int answer=1; //연산이 가능한 경우 1 
			for(int i=1;i<=N;i++) {
				String[] tmp = br.readLine().split(" ");
				value[i]=tmp[1];
				if(tmp.length==4) { //자식 노드 개수에 따라 다르게 처리해준다
					tree[i][0]=Integer.parseInt(tmp[2]);
					tree[i][1]=Integer.parseInt(tmp[3]);
				}
				else if(tmp.length==3) {
					tree[i][0]=Integer.parseInt(tmp[2]);
				}
			}
			
			for(int i=1;i<=N;i++) {
				if(tree[i][0]==0||tree[i][1]==0) { //자식 노드가 없는데
					if(isOperator(value[i])) { //노드 값이 연산자일 경우
						answer=0; //연산 불가능
						break;
					}
				}

		}
			System.out.println("#"+test_case+" "+answer);
		}
	}
}

[소감]

배열을 이용한 트리 구현에 대해 찔끔 이해가 된 것 같다. 

'알고리즘' 카테고리의 다른 글

[SWEA] 7465. 창용 마을 무리의 개수 (JAVA)  (0) 2022.03.03
[SWEA] 1289. 양세기 (JAVA)  (0) 2022.02.23
[SWEA] 1232. 사칙연산 (JAVA)  (0) 2022.02.09
[SWEA] 1231. 중위순회 (JAVA)  (0) 2022.02.08
[SWEA] 1226. 미로1 (JAVA)  (0) 2022.02.08