산술식에서 올바른 괄호인지 판단하기

문제

계산기 프로그램에서 소괄호(), 중괄호{}, 대괄호[] 세 종류의 괄호를 사용하며, 괄호의 포함관계는 소괄호 < 중괄호 < 대괄호 순서입니다. 이 순서는 반드시 지켜져야 합니다. 예: [ { ( ) } ]
입력된 산술식에 괄호가 옳게 구성되었는지 확인하는 solution 함수를 완성해 주세요.

  • 입력되는 산술식은 검증하지 않습니다.
  • if 구문 등 비교문은 10개 이하만 사용하시오.

( switch case문에서 case갯수, 3항 연산자 등 if로 계산할 수 있는 비교 구문)

  • 추가 제약조건은 아래와 같습니다.
    • 여는(왼쪽) 괄호는 닫는(오른쪽) 괄호 앞에 와야 하며, 항상 쌍을 이뤄야 한다.
    • 포함 관계에 따라 다수의 다른 괄호를 포함 할 수 있다. 예. [ { ( ) ( ) } { } ]
    • 동일한 레벨의 괄호는 스스로를 포함할 수 없다. 예. { { } } 불가

입출력 예

스크린샷 2019-12-15 오후 7 15 22

import java.util.Stack;

public class StackExample {


    private static int getBrace(char c){
        if(c == '{') {
            return c - 40;
        } else {
            return c;
        }
    }


    public boolean solution(String input) {

        boolean result = true;

        Stack<Character> str = new Stack<>();

        int first = 0;
        int remain = 0;

        for (char c : input.toCharArray()) {

            if ((int) c > 41 && c <= 57) continue;

            // [ = 91, { = 123 , ( = 40
            if (c == '[' || c == '{' || c == '(') {
                if (str.size() == 0) {
                    first = getBrace(c);
                } else {
                  remain = getBrace(c);

                    if (first <= remain) {
                        result = false;
                        break;
                    }
                }

                first = getBrace(c);
                str.push(c);

            } else {

                if (str.size() < 1) {
                    result = false;
                    break;
                }

                if (c == ']' && str.pop() != '[') {
                    result = false;
                    break;
                }

                if (c == '}' && str.pop() != '{') {
                    result = false;
                    break;
                }

                if (c == ')' && str.pop() != '(') {
                    result = false;
                    break;
                }

            }

        }

        if (str.size() != 0) {
            result = false;
        }

        return result;
    }


    public static void main(String[] args) {

        StackExample stack = new StackExample();

        System.out.println(stack.solution("3+[(5+1)-1]"));
        System.out.println(stack.solution("3+([5+1])"));
        System.out.println(stack.solution("3+{(5+1}"));
        System.out.println(stack.solution("3+[{(5+1)-1}+3]"));
        System.out.println(stack.solution("3+[{{5+1}-1}+3]"));
    }
}

괄호의 포함관계와 동일한 괄호는 서로를 포함할 수 없는 조건을 판단하기 위해서 저는 자료구조 중에서 stack을 사용해서 풀었습니다.
해당 문자열을 각각 char 타입으로 변환 후에 산술식(0 ~ 9, +, -, *, /)은 아스키 코드 표에서 42 ~ 57에 포함되기 때문에 continue를 이용하여 걸렀습니다.
그리고 {(중괄호)의 경우에는 [(대괄호) 보다 우선순위가 낮지만 아스키 코드 테이블에서는 값이 더 크기 때문에 ((소괄호)가 아스키 코드 값으로 40이기 때문에 이 값을 기준으로
우선 순위의 값을 구해서 올바른 괄호인지 판단하도록 코드를 작성하였습니다.

+ Recent posts