알고리즘
[SWEA] 1233. 사칙연산 유효성 검사 (JAVA)
애용쓰
2022. 2. 9. 00:10
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);
}
}
}
[소감]
배열을 이용한 트리 구현에 대해 찔끔 이해가 된 것 같다.