SWEA 1233 - 사칙연산 유효성 검사

Updated:

Java

1233 번 - 사칙연산 유효성 검사

문제

사칙연산 “+, -, *, /”와 양의 정수로만 구성된 임의의 이진 트리가 주어질 때, 이 식의 유효성을 검사하는 프로그램을 작성하여라.

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

접근 방법

문제 입력을 자세히 보면 [해당 정점의 위치, 해당 정점의 문자, 왼쪽 자식의 위치, 오른쪽 자식의 위치]가 주어지고, 어느순간 [해당 정점의 위치, 해당 정점의 문자]만 주어지게 바뀐다.
즉 초반 1 ~ k개 까지는 자식 노드를 가진 부모 노드들이 주어지고, 이후 k+1 ~ N개까지 단말 노드가 주어진다.

다시 생각해 보면, 사칙연산에서 연산자는 피연산자 2개를 가져야 하며, 피연산자는 숫자를 가져야한다! 즉, 자식 노드를 가진 노드는 연산자가 와야하며, 단말 노드에 연산자가 오면 안된다!

위 방법으로 접근하여, 부모 노드에 연산자가 오는지, 단말 노드에 숫자가 오는지 확인하여 유효성을 판별한다.

구현

부모노드인지 단말노드인지 확인하는 방법은, hasMoreTokens으로 판별하였다.
2개의 문자를 받고, 그 뒤에 더 문자가 오면 왼쪽, 오른쪽 위치를 알리므로 부모노드인 것으로 생각하고 2개의 문자로 끝나면 단말 노드로 생각하였다.

이후 조건문을 사용하여 부모 노드 일때, 해당하는 문자가 숫자인 경우 유효성이 옳지 않으므로 isRight라는 변수를 통하여 유효성이 옳지 않은 tree라고 판별하였다.
마찬가지로, 단말 노드 일때, 해당하는 문자가 숫자가 아닌경우 유효성이 옳지 않다고 판별하였다.

코드

import java.io.*;
import java.util.*;

class Solution {
	static int result = 0;
	public static void main(String []args) throws Exception {  
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	StringTokenizer st;
    	int tc = 10;
    	
    	for(int idx = 1; idx <= tc; idx++) {
    		int n = stoi(br.readLine());
    		int isRight = 1;
    		char curN;
    		for(int i = 1; i <= n; i++){
    			
    			st = new StringTokenizer(br.readLine());
    			st.nextToken();
    			curN = st.nextToken().charAt(0);
    			if(st.hasMoreTokens()) {	// 단말 노드가 아닐 때, 사칙 연산이 있어야한다.
    				if('0' <= curN && curN <= '9') {	// 숫자인 경우, 유효성이 옳지 않다
    					isRight= 0;
    				}
    			}
    			else {						// 단말 노드 일 때, 숫자가 있어야 한다.
    				if(curN < '0' || '9' < curN ) {		// 숫자가 아닌 경우, 유효성이 옳지 않다
    					isRight= 0;
    				}
    			}
    		}
    		
    		System.out.println("#" + idx + " " + isRight);
    	}
    	
	}
	
	static int stoi(String str) {
    	return Integer.parseInt(str);
    }
}

총평

난이도

⭐★★★★

후기

개선할 점

없없