[알고리즘] 1233. 사칙연산 유효성 검사

2024. 2. 18. 15:12Algorithm/with Java

0. 문제

 

 

SW Expert Academy

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

swexpertacademy.com

 


1. 문제 이해

 

  1. 트리

 


2. 제출

 

방법 1

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

public class SWEA1233 {

    static String[] opers = {"+", "-", "*", "/"};
    static int level, firstLeaf, lastLeaf;
    static int N;
    static BufferedReader br;
    static StringTokenizer st;
    public static void main(String[] args) throws Exception {
        br = new BufferedReader(new InputStreamReader(System.in));
        StringBuffer sb = new StringBuffer();

        for(int tc=1; tc<=10; tc++) {
//        for(int tc=1; tc<=1; tc++) {
            st = new StringTokenizer(br.readLine());
            N = Integer.parseInt(st.nextToken());

            level = (int)(Math.log(N)/Math.log(2));
            firstLeaf = (int)Math.pow(2, level) - ((int)Math.pow(2, (level+1))-1-N)/2;
            lastLeaf = N;
            //System.out.println(level+" "+firstLeaf+" "+lastLeaf);

            boolean flag1 = checkOper(tc);
            boolean flag2 = checkLeaf(tc);
            sb.append("#").append(tc).append(" ").append((flag1 && flag2) ? 1 : 0).append("\n");
        }
        System.out.println(sb.toString());
        br.close();
    }

    static boolean checkOper(int tc) throws Exception {
        boolean flag = true;
        label : for(int i=1; i<firstLeaf; i++) { // 루트, 중간 노드
            String[] arr = br.readLine().split(" ");

            // 연산자인지 확인
            for(String oper : opers) {
                if(arr[1].equals(oper)) {
                    continue label;
                }
            }
            flag = false;
            //System.out.println(tc+"oper i :"+i + " node : " + arr[0]+" : "+ arr[1]);
        }
        return flag; // 모든 검사 통과
    }

    static boolean checkLeaf(int tc) throws Exception {
        boolean flag = true;
        label : for(int i=firstLeaf; i<=lastLeaf; i++) { // 단말 노드
            String[] arr = br.readLine().split(" ");

            // 숫자인지 확인
            if((arr[1].charAt(0) >= '0') && (arr[1].charAt(0) <= '9')) { 
                continue label;
            }
            flag = false;
            //System.out.println(tc+" leaf i :"+i + " node : " + arr[0]+" : "+ arr[1]);
        }
        return flag; // 모든 검사 통과
    }
}
  • firstLeaf = (int)Math.pow(2, level) - ((int)Math.pow(2, (level+1))-1-N)/2;
    : 첫번째 단말 노드의 인덱스를 계산한다.
  • boolean flag1 = checkOper(tc); : 루트, 중간 노드는 모두 연산자인지 확인하다.
  • boolean flag2 = checkLeaf(tc); : 단말 노드가 모두 숫자인지 확인한다.

 


방법 2

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

public class SWEA1233_2 {

    static int N;
    static List<Node> list;
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        StringBuffer sb = new StringBuffer();

        for(int tc=1; tc<=10; tc++) {
            st = new StringTokenizer(br.readLine());
            N = Integer.parseInt(st.nextToken());
            list = new ArrayList<>(N);
            list.add(null); // 0번째

            for(int i=1; i<=N; i++) {
                String[] input = br.readLine().split(" ");
                Node newNode = new Node(input[1], i*2, i*2+1);
                list.add(newNode);
            }
            boolean flag = check();
            sb.append("#").append(tc).append(" ").append(flag ? 1 : 0).append("\n");
        }

        System.out.println(sb);
        br.close();
    }

    static boolean check() {
        for(int i=1; i<=N; i++) {
            Node node = list.get(i);

            // 단말노드
            if((node.left>N)&&(node.right>N)) {
                boolean isNum = '0' <= node.data.charAt(0) && node.data.charAt(0) <= '9';
                if(!isNum) return false;
            }
            // 비단말노드
            else {
                boolean isOper = false;
                isOper = node.data.charAt(0) == '+' || node.data.charAt(0) == '-' || node.data.charAt(0) == '*' || node.data.charAt(0) == '/'; 
                if(!isOper) return false;
            }
        }
        return true;
    }

    static class Node {
        String data;
        int left;
        int right;

        Node(String data, int left, int right){
            this.data = data;
            this.left = left;
            this.right = right;
        }

    }

}
  • if((node.left>N)&&(node.right>N)) { : 단말 노드인지 쉽게 확인하는 방법.

 


'Algorithm > with Java' 카테고리의 다른 글

[알고리즘] 2493. 탑  (0) 2024.02.18
[알고리즘] 9229. 한빈이와 Spot Mart  (0) 2024.02.18
[Java] 비트 마스킹, Next_Permutation  (0) 2024.02.18
[Java] 트리  (0) 2024.02.18
[Java] 연결 리스트  (0) 2024.02.18