1 분 소요

1. 문제 접근 방법 및 순서

  1. 핵심 아이디어
    • 연산자(+,-,*,/): 반드시 자식 노드를 가집니다.
    • 숫자: 자식 노드가 없는 단말 노드여야 합니다.
  2. 접근 순서
    • 전체 노드의 개수 N을 확인합니다.
    • 각 노드의 정보를 한 줄씩 읽으며, 해당 노드가 자식을 가지고 있는지 여부를 파악합니다.
    • 자식이 있는데 숫자인 경우 혹은 자식이 없는데 연사자인 경우를 찾아 result를 0으로 바꿉니다.


2. 문제 해결에 필요한 개념 및 알고리즘

  1. 트리 노드의 성질
    • 연산자는 이항 연산을 수행해야 하므로 반드시 두 개의 자식을 가집니다.
    • 숫자는 계산의 대상일 뿐이므로 자식을 가질 수 없습니다.


3. 어려웠던 점

  • StringTokenizer를 쓸 때, 자식 노드의 번호가 1개 일 수도, 2개일 수도, 없을 수도 있다는 점을 처리하는 것이 난이도가 있었습니다.


4. 코드 풀이

4.1 핵심 아이디어

// 루트 노드
char root = st.nextToken().charAt(0);
boolean isOpt = root == '+' || root == '*' || root == '-' || root == '/';

// 자식이 존재여부 체크
// 자식이 존재하면 연산자이다.
// 자식이 존재하지 않으면 숫자이다.
if (st.hasMoreTokens()) {
	if (!isOpt) {
		result = 0;
	}
} 
else {
	if (isOpt) {
		result = 0;
	}
}
  • 해당 노드가 자식을 가지고 있는지 여부를 파악합니다.
  • 루트가 연산자인지 숫자인지 파악합니다.
  • 자식이 있는데 루트가 숫자인 경우 혹은 자식이 없는데 루트가 연사자인 경우를 찾아 result를 0으로 바꿉니다.

4.2 전체 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Solution_사칙연산유효성검사 {

	public static void main(String[] args) throws NumberFormatException, IOException {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();

		// tc 수행
		for (int tc = 1; tc <= 10; tc++) {

			// 정점의 총 수 입력
			int N = Integer.parseInt(br.readLine().trim());

			int result = 1; // 연산 가능 여부

			// 정점의 정보 입력
			for (int i = 0; i < N; i++) {
				StringTokenizer st = new StringTokenizer(br.readLine());

				// 사용하지 않는 입력 제거
				st.nextToken();

				// 루트 노드
				char root = st.nextToken().charAt(0);
				boolean isOpt = root == '+' || root == '*' || root == '-' || root == '/';

				// 자식이 존재여부 체크
				// 자식이 존재하면 연산자이다.
				// 자식이 존재하지 않으면 숫자이다.
				if (st.hasMoreTokens()) {
					if (!isOpt) {
						result = 0;
					}
				} else {
					if (isOpt) {
						result = 0;
					}
				}

			}

			sb.append("#" + tc + " " + result + "\n");
		} // tc 종료

		// 출력
		System.out.println(sb);
	}

}

카테고리:

업데이트: