알고리즘
SWEA 1233 사칙연산 유효성 검사
알로겐
2021. 2. 10. 14:28
[SWEA D4 1233 사칙연산 유효성 검사]


완전이진트리 문제이다.
수식이 성립되려면 숫자 사이에 무조건 연산자가 있어야 한다. 8*2 이렇게. 그러면 단말 노드(리프노드)는 무조건 숫자여야 하고, 연산자 노드는 무조건 자식 노드(왼, 오)가 둘 다 있어야 한다.
처음엔 dfs로 중위순회해서 8/2*6-4 이런 순서로 전부 노드를 검사해야하나 싶었다.그런데 문제를 풀다 보니 입력이 주어질 때 [노드 번호 노드정보 왼노드 오른노드] 이렇게 주어지는게 아닌가?
그럼 그냥 입력받으면서 현재 노드가 숫자인데 뒤에 자식 노드 정보가 있는지, 연산자인데 뒤에 자식 노드가 없는지 두 가지만 체크해주면 된다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
/**
* 사칙연산 유효성 검사
* */
public class Solution{
static int N;
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
for(int tc=1; tc<=10; tc++) {
int N = Integer.parseInt(in.readLine());
boolean flag = true;
StringTokenizer st;
for(int i=0; i<N; i++) {
st = new StringTokenizer(in.readLine(), " ");
st.nextToken();
// flag를 설정해줘서 이미 안되는 수식이면 건너뛴다.
if(!flag) continue;
String node = st.nextToken();
// 현재 노드가 연산자일 때 뒤에 자식 노드 정보가 더 있는지 체크. 있으면 수식성립 안됨
if(node.equals("+") || node.equals("-") || node.equals("*") || node.equals("/")) {
if(!st.hasMoreTokens())
flag = false;
}else {
// 현재 노드가 숫자일 땐 뒤에 자식 노드가 있으면 안됨.
if(st.hasMoreTokens())
flag = false;
}
}
System.out.printf("#%d %d\n", tc, flag ? 1 : 0);
}
}
}