[ 스택 ] - 괄호의값
2504 번 문제는 스택을 활용하는 문제라고해서 풀어보았다.
처음에 스택을 안쓰고 정규식을 써서 하다가 실패...
코딩하면서 스택을 구현해본적이있나 싶을정도로 사용해보지않은 자료구조였다.
기본적으로 컴퓨터관련 시험을 봐보셨으면 들어봤을만한 LIFO 개념이 나온다
쉽게말하면 컨테이너에 짐을쌓는데 안에서부터 차곡차곡쌓다보니 꺼낼때는 겉에꺼 부터 꺼낸다는 개념이다
규칙은 아래에 써어놯고 아래 써놓은대로 구현하였다.
하지만 놓친부분이 )) 이나 ((]) 이런 문자가들어왔을때 상황을 처리해놓지 않아서 (EmptyStack) 과 43%에서 계속 틀렸다.
급하게 풀어보느라 로직이 깔끔하지못하지만 좀더 간단하게 다시 풀어보기싶다.
이문제가 너무 어렵다면 9012 를 먼저 풀어보는것도 나쁘지않다
https://www.acmicpc.net/problem/9012
9012번: 괄호
괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고
www.acmicpc.net
https://www.acmicpc.net/problem/2504
2504번: 괄호의 값
4개의 기호 ‘(’, ‘)’, ‘[’, ‘]’를 이용해서 만들어지는 괄호열 중에서 올바른 괄호열이란 다음과 같이 정의된다. 한 쌍의 괄호로만 이루어진 ‘()’와 ‘[]’는 올바른 괄호열이다. 만일
www.acmicpc.net
package com.myproject.CodeTest;
import java.util.*;
public class Main {
static boolean bool=true;
static Stack<String> stack = null;
public static void main(String[] args) {
//1. ( 이거나 [ 일 경우 넣는다
//2. ) 이거나 ] 일 경우 전에꺼를 꺼낸다.
//3, 꺼낸게 (이거나 [ 인경우 숫자2 , 숫자 3을 넣는다
//4. 꺼낸게 숫자일경우 임시로 저장해놓고 하나더 꺼낸다.
//5. 하나 더 꺼낸게 (일경우 숫자 *2,[일경우 *3을 한다.
//6. 하나 더 꺼낸게 숫자일경우 꺼낸숫자와 저장한 숫자를 더한후 넣는다
Scanner sc =new Scanner(System.in);
stack = new Stack<>();
String s = sc.nextLine();
for(int i =0 ;i <s.length();i++) {
char c= s.charAt(i);
check(c);
}
int total=0;
int length = stack.size();
for(int i = 0 ; i<length;i++) {
String result = stack.pop();
try {
total+=Integer.parseInt(result);
}catch (Exception e) {
bool=false;
}
}
if(bool) {
System.out.println(total);
}else {
System.out.println(0);
}
}
static void check(char c) {
if(c=='(' || c=='[') { //1 .
stack.push(c+"");
}else {
String tmpc="";
try {
tmpc = stack.pop(); // 하나 꺼냄
if(c==')') {
if(tmpc.contentEquals("(")) {// 3 .
stack.push("2");
}else if(tmpc.contentEquals("[")){
bool=false;
}else {
String tmpcc = stack.pop();
if(tmpcc.contentEquals("(")) {// 5
stack.push(Integer.parseInt(tmpc)*2+"");
}else if(tmpcc.contentEquals("[")) { //5 .
bool=false;
}else {
int a = Integer.parseInt(tmpc)+Integer.parseInt(tmpcc);
stack.push(a+"");
check(c);
}
}
}else if (c==']') {
if(tmpc.contentEquals("[")) { //3 .
stack.push("3");
}else if(tmpc.contentEquals("(")){
bool=false;
}else {
String tmpcc = stack.pop();
if(tmpcc.contentEquals("(")) {// 5
bool=false;
}else if(tmpcc.contentEquals("[")) { //5 .
stack.push(Integer.parseInt(tmpc)*3+"");
}else {
int a = Integer.parseInt(tmpc)+Integer.parseInt(tmpcc);
stack.push(a+"");
check(c);
}
}
}
}catch (Exception e) {
bool=false;
}
}
}
}