https://www.acmicpc.net/problem/2504
골드5
구현 방법
조건에 만족하지 않는 경우는 크게 3가지가 존재한다.
1. 괄호 모양이 다른 경우
2. 여는 괄호가 더 많은 경우. (, [
3. 닫는 괄호가 더 많은 경우. ), ]
스택을 활용하여 문제를 해결했고, 아래 규칙을 반복적으로 수행했다.
1. 여는 괄호는 스택에 넣는다.
2. 닫는 괄호가 나오면 같은 모양의 여는 괄호가 나올 때까지 스택에서 꺼낸다. 이 때 나오는 숫자를 다 더해준다.
3-1. 더해진 숫자가 0인 경우, 가장 안쪽 괄호 쌍이므로 2나 3을 스택에 넣는다.
3-2. 더해진 숫자가 0이 아닌 경우, 해당 숫자에 2나 3을 곱한 뒤 스택에 넣는다.
3-3. 같은 모양이 아닌 경우, 0을 출력한다.
4. 1~3 반복 후, 스택에서 숫자를 꺼내 모두 더하면 답이다.
하지만 숫자 외에 괄호가 나온다면 위의 '조건 2번에서 여는 괄호가 많은 경우' 이므로 0을 출력한다.
코드
import java.util.*;
import java.io.*;
/**
* 백준 2504
* 괄호의 값
* 골드5
* https://www.acmicpc.net/problem/2504
*/
public class Boj2504 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
char[] cs = br.readLine().toCharArray();
Stack<String> s = new Stack<>();
boolean flag = false; // 괄호 짝이 다른 경우 false
for(char c : cs) {
if(c == '(' || c == '[') {
s.add(c + "");
} else if(c == ')'){
int num = 0;
flag = false;
while(!s.isEmpty()) {
String temp = s.pop();
if(temp.equals("(")) {
flag = true; // 괄호 짝이 맞는 경우
break;
} else if(temp.equals("[")){
break;
} else {
num += Integer.parseInt(temp);
}
}
if(!flag) {
break;
}
num = num == 0 ? 2 : num * 2;
s.add(num + "");
} else if(c == ']'){
int num = 0;
flag = false;
while(!s.isEmpty()) {
String temp = s.pop();
if(temp.equals("[")) {
flag = true;
break;
} else if(temp.equals("(")){
break;
} else {
num += Integer.parseInt(temp);
}
}
if(!flag) {
break;
}
num = num == 0 ? 3 : num * 3;
s.add(num + "");
}
}
int answer = 0;
if(flag) {
while(!s.isEmpty()) {
String temp = s.pop();
// 괄호가 남아 있는 경우
if(temp.equals("(") || temp.equals("[")) {
answer = 0;
break;
}
answer += Integer.parseInt(temp);
}
}
System.out.println(answer);
}
}

'알고리즘' 카테고리의 다른 글
자바 - 백준 9252 / LCS 2 (2) | 2024.12.21 |
---|---|
자바 : 백준 2589 / 보물섬 (1) | 2024.12.16 |
자바 - 백준 1101 / 카드 정리 1 (0) | 2024.12.07 |
자바 - 백준 2098 / 외판원 순회 (0) | 2024.12.05 |
자바 - 코드트리 / 빙산의 일각 (0) | 2024.10.29 |