코드 1, 성공, 230825
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Stack;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
Stack<Character> stack = new Stack<Character>();
int result = 0;
int value = 1;
for(int i = 0; i<str.length(); i++){
if (str.charAt(i) == '(') {
stack.add(str.charAt(i));
value *= 2;
} else if (str.charAt(i) == '[') {
stack.add(str.charAt(i));
value *= 3;
} else if(str.charAt(i) == ')') {
if(stack.empty()){
System.out.println(0);
return;
} else {
if (str.charAt(i-1) == '(') {
result += value;
} else {
if (stack.peek() != '('){
System.out.println(0);
return;
}
}
}
value /= 2;
stack.pop();
} else if(str.charAt(i) == ']') {
if(stack.empty()){
System.out.println(0);
return;
} else {
if (str.charAt(i-1) == '[') {
result += value;
} else {
if (stack.peek() != '['){
System.out.println(0);
return;
}
}
}
value /= 3;
stack.pop();
}
}
if(stack.size() > 0){
System.out.println(0);
return;
}
System.out.println(result);
}
}
풀이
1. 올바른 괄호열의 확인
올바른 괄호열이 라는 것은 (), [] 처럼 완벽한 형태의 괄호이거나 올바른 괄호들을 포함하고 있는 경우
- 이는 스택을 이용했을 때 (, [ 인 경우는 적재, ), ]인 경우는 스택 최상위에서 반대 짝을 없애는 행위를 통해 결론적으로 올바른 괄호열인지 판단할 수 있다
- 스택을 이용해 오른쪽으로 열린 경우만 적재, 그 외는 스택 상태로 판단
- 비어있거나 peek가 짝이 아니라면 올바르지 않은 괄호열
2. 괄호열 계산
우리가 직접 계산할 때 () or [] 처럼 직접 마주보고 있는 지점부터 계산하는 것처럼 코드도 마찬가지
- 이를 위해 분배 법칙 적용
- 분배 법칙을 이용할 때 이전 형태와 현재 형태가 (), [] 형태로 합쳐지는 경우에만 결과값에 추가해주면 된다
'Algorithm' 카테고리의 다른 글
[백준] 14719 (0) | 2023.08.29 |
---|---|
[백준] 14891 (0) | 2023.08.29 |
[백준] 5430 (0) | 2023.08.29 |
[백준] 16927 (0) | 2023.08.29 |
[백준] 1790 (0) | 2023.08.29 |
댓글