https://www.acmicpc.net/problem/2504
2504번: 괄호의 값
4개의 기호 ‘(’, ‘)’, ‘[’, ‘]’를 이용해서 만들어지는 괄호열 중에서 올바른 괄호열이란 다음과 같이 정의된다. 한 쌍의 괄호로만 이루어진 ‘()’와 ‘[]’는 올바른 괄호열이다. 만일 X
www.acmicpc.net
풀이)
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Stack;
public class Main_BJ_2504_괄호의값 {
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
Stack<Character> stack = new Stack<>();
int sum = 0;
int temp = 1;
for(int i=0; i<str.length(); i++){
char c = str.charAt(i);
if(c == '(') {
stack.push(c);
temp *= 2;
}
else if(c == '['){
stack.push(c);
temp *= 3;
}
else if(c == ')'){
if(stack.isEmpty() || stack.peek()!='('){
sum = 0;
break;
}
if(str.charAt(i-1) == '(')
sum += temp;
temp /= 2;
stack.pop();
}
else{
if(stack.isEmpty() || stack.peek()!='['){
sum = 0;
break;
}
if(str.charAt(i-1) == '[')
sum += temp;
temp /= 3;
stack.pop();
}
}//for
if(stack.isEmpty())
System.out.println(sum);
else System.out.println(0); //stack에 괄호가 존재할경우 짝이 안 맞음
}//main
}
괄호 짝 맞추기는 했는데 계산하는게 꼬여서 틀렸던 문제다.
먼저, 짝이 맞는 케이스만 생각해보면,,
'('가 들어온다면 temp*=2, '['가 들어온다면 temp*=3을 해준다.
그 후, ')' 이나 ']' 을 만났을 때 전체 값에 temp를 올려서 더해주면 된다.
그리고 ')'이면 /2, ']'이면 /3을 하면 된다.
이때, 주의할 점은 연속된 여는 괄호가 있을 때다. => ([[]]) 와 같은 경우!!
나누기를 계속 해줘야지 중복으로 더하는 것을 방지할 수 있다.
이를 확인하는 방법은 닫힌 괄호가 나올 때마다 그 앞의 괄호와 짝이 맞는지를 확인하면 된다.
짝이 맞는다면 전체 값에 올려주는 과정을 진행하면 되고, 안 맞는다면 나누기만 반복하면 된다.
그리고 예외 케이스로, 짝이 안 맞을 땐 두 가지로 확인할 수 있다.
1. 열린 괄호와 닫힌 괄호가 짝이 안 맞을 때
2. 열린 괄호의 개수가 닫힌 괄호의 개수보다 많아서 짝이 안 맞을 때
1번의 경우 코드에서 닫힌 괄호가 나왔을 때, 스택이 비었거나(짝이 없음) 짝이 안 맞을 경우 바로 전체 값을 0으로 만들어 주었다.
2번의 경우 for문을 다 나와서 stack에 값이 존재하는지를 확인하여 케이스를 처리해주었다.
'코테 > 백준' 카테고리의 다른 글
백준 14916 거스름돈(JAVA) (0) | 2023.06.19 |
---|---|
백준 5014 스타트링크(JAVA) (0) | 2023.06.15 |
백준 1316 그룹 단어 체커(JAVA) (0) | 2023.06.14 |
백준 1713 후보 추천하기(JAVA) (0) | 2023.06.05 |
백준 7562 나이트의 이동(JAVA) (0) | 2023.06.04 |