반응형
출처: https://www.acmicpc.net/problem/2504
Approach
스택을 이용하는 대표적인 문제이다.
괄호를 스택에 넣어서 올바른 괄호쌍을 맞추는지 확인한다.
import java.util.Scanner;
class Stack {
int top;
String[] stack;
public Stack(int size) {
top = -1;
stack = new String[size];
} // 스택 초기
public void push(String value) {
stack[++top] = value;
}
public String pop() {
return stack[top--]; //아이템을 반환하고 top 감소
}
}
public class Main {
public static void main(String[] args) {
Stack judge_stack = new Stack(50);
Stack st = new Stack(500);
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
for(int i=0; i<str.length(); i++){
if(str.charAt(i) == '(' || str.charAt(i) == '['){
judge_stack.push(Character.toString(str.charAt(i)));
}
else if(str.charAt(i) == ')'){
if(judge_stack.top == -1){
System.out.println(0);
return;
}
String temp = judge_stack.pop();
if(!temp.equals("(")){
System.out.println(0);
return;
}
}
else if(str.charAt(i) == ']'){
if(judge_stack.top == -1){
System.out.println(0);
return;
}
String temp = judge_stack.pop();
if(!temp.equals("[")){
System.out.println(0);
return;
}
}
}
if(judge_stack.top != -1){
System.out.println(0);
return;
}
// 결과 계산
int result = 0;
int temp_result = 0;
int last_result = 0;
for(int i=0; i<str.length(); i++){
if(str.charAt(i) == '('){
if(str.charAt(i+1) == ')'){
st.push("2");
i++; // ()는 숫자로 처리
}
else{
st.push("(");
st.push("2");
st.push("*");
}
}
else if(str.charAt(i) == '[' ){
if(str.charAt(i+1) == ']'){
st.push("3");
i++; // []는 숫자로 처리
}
else{
st.push("[");
st.push("3");
st.push("*");
}
}
else if(str.charAt(i) == ')'){
while(true){
if(st.top == -1)
break;
String temp = st.pop();
if(temp.equals("("))
break;
else if(temp.equals("*")){
result = result * Integer.parseInt(st.pop());
}
else{
result = result + Integer.parseInt(temp);
}
}
if(st.top == -1){
// [()()()]와 같 경우를 처리하기 위해
last_result = last_result + result;
result = 0;
}else{
st.push(String.valueOf(result));
result = 0;
}
}
else if(str.charAt(i) == ']'){
while(true){
if(st.top == -1)
break;
String temp = st.pop();
if(temp.equals("["))
break;
else if(temp.equals("*")){
result = result * Integer.parseInt(st.pop());
}
else{
result = result + Integer.parseInt(temp);
}
}
if(st.top == -1){
// [()()()]와 같 경우를 처리하기 위해
last_result = last_result + result;
result = 0;
}else{
st.push(String.valueOf(result));
result = 0;
}
}
}
while(st.top != -1){
last_result = last_result + Integer.parseInt(st.pop());
// ()()() 으로 이뤄졌을 때 혹시 result로 계산된 값이 있으면 마저 처리
if(st.top == -1)
{
last_result = last_result + result;
}
}
System.out.println(last_result);
}
}
반응형
'PS 문제 풀이 > Baekjoon' 카테고리의 다른 글
[BOJ] 백준 10773 제로 (0) | 2021.07.21 |
---|---|
[BOJ] 백준 1712 손익분기점 (0) | 2021.07.05 |
[BOJ] 백준 21610 마법사 상어와 비바라기 (2) | 2021.05.30 |
[BOJ] 백준 21611 마법사 상어와 블리자드 (9) | 2021.05.24 |
[BOJ] 백준 21609 상어 중학교 (4) | 2021.05.23 |
댓글