알고리즘
Programmers - 산술식에서 올바른 괄호인지 판단하기
준준영
2019. 12. 15. 19:46
산술식에서 올바른 괄호인지 판단하기
문제
계산기 프로그램에서 소괄호(), 중괄호{}, 대괄호[] 세 종류의 괄호를 사용하며, 괄호의 포함관계는 소괄호 < 중괄호 < 대괄호 순서입니다. 이 순서는 반드시 지켜져야 합니다. 예: [ { ( ) } ]
입력된 산술식에 괄호가 옳게 구성되었는지 확인하는 solution 함수를 완성해 주세요.
- 입력되는 산술식은 검증하지 않습니다.
- if 구문 등 비교문은 10개 이하만 사용하시오.
( switch case문에서 case갯수, 3항 연산자 등 if로 계산할 수 있는 비교 구문)
- 추가 제약조건은 아래와 같습니다.
- 여는(왼쪽) 괄호는 닫는(오른쪽) 괄호 앞에 와야 하며, 항상 쌍을 이뤄야 한다.
- 포함 관계에 따라 다수의 다른 괄호를 포함 할 수 있다. 예. [ { ( ) ( ) } { } ]
- 동일한 레벨의 괄호는 스스로를 포함할 수 없다. 예. { { } } 불가
입출력 예
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이기 때문에 이 값을 기준으로
우선 순위의 값을 구해서 올바른 괄호인지 판단하도록 코드를 작성하였습니다.