https://www.acmicpc.net/problem/2504
1. 유형
스택, 문자열
2. 시뮬레이션
난이도에 비해 예외케이스가 많아서 까다로웠던 문제.
로직
- 여는괄호 ( [ 와 닫히는괄호 ) ]가 연속해서 붙어있는 경우에 합을 계산.
예외처리를 신경써야한다.
- 맨 앞에 여는괄호가 나오는 경우 )() -> 0
- 길이가 1인 경우 ) -> 0
- 짝이 안 맞는 경우 (() -> 0
3. 코드
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(in.readLine());
String S=st.nextToken();
Stack<Character> stack=new Stack<>();
int K=1;
int sum=0;
for(int i=0;i<S.length();i++) {
if(S.charAt(i)=='(') {
K*=2;
stack.add('(');
}else if(S.charAt(i)=='[') {
K*=3;
stack.add('[');
}else if(!stack.isEmpty()&&S.charAt(i)==')') {
if(i-1>=0&&S.charAt(i-1)=='(') {
sum+=K;
}else {
if(stack.peek()!='(') {
sum=0;
break;
}
}
K/=2;
stack.pop();
}else if(!stack.isEmpty()&&S.charAt(i)==']') {
if(i-1>=0&&S.charAt(i-1)=='[') {
sum+=K;
}else {
if(stack.peek()!='[') {
sum=0;
break;
}
}
K/=3;
stack.pop();
}else {
sum=0;
break;
}
}
if(!stack.isEmpty())
System.out.println(0);
else
System.out.println(sum);
}
static int stoi(String s) {
return Integer.valueOf(s);
}
}
/*
붙어있을때만 계산
int K
for N:
if (:
K*=2
스택에 저장
if [:
K*=3
스택에 저장
if ):
if 이전값이 (일때 sum에 추가
else
if 탑이 ( 아님:
break
나누기
stack.pop
if ]:
if 이전값이 [일때 sum에 추가
else
if 탑이 [ 아님:
break
나누기
stack.pop -> 예외처리, 비어있을경우 런탐에러
else:
첨부터 ] )나온경우
if stack이 empty가 아님:
else empty임
*/
4. 느낀점
낮은 난이도 치고는 예외처리할게 많아서 조금
복잡했던 문제였다. 수도코드를 짜는것이 많은 도움이 된거같다.
'알고리즘 > 백준' 카테고리의 다른 글
[devmoon]백준 18403 - (Java) 무기공학 (0) | 2021.07.13 |
---|---|
[devmoon]백준 15566 - (Java)개구리1 (0) | 2021.07.13 |
[devmoon]백준 - 17609 (Java) 회문 (0) | 2021.07.09 |
[devmoon]백준 1062 골드4 - (Java) 가르침 (0) | 2021.07.06 |
[devmoon] 골드4 백준 - 2661 좋은 수열 (0) | 2021.07.05 |