https://www.acmicpc.net/problem/2504

 

2504번: 괄호의 값

4개의 기호 ‘(’, ‘)’, ‘[’, ‘]’를 이용해서 만들어지는 괄호열 중에서 올바른 괄호열이란 다음과 같이 정의된다. 한 쌍의 괄호로만 이루어진 ‘()’와 ‘[]’는 올바른 괄호열이다. 만일 X

www.acmicpc.net

코드설명

스택 자료구조를 활용하는 문제입니다.

 

문제에 대한 아이디어를 떠올려야 하는 문제입니다.

문제의 가장 중요한점은,

처음 '('  혹은 '['가 들어가면서 먼저 변수값에 *2 혹은 * 3을 진행하며 나아갑니다.

만약 ')' 혹은 ']'를 만났을때는 이전 i-1값이 여는 괄호일경우 정답에 계산값을 더해줍니다.

닫는 괄호를 만났을떄는 /=2, /=3 을 통해서 이전값으로 돌려놓습니다.

 

코드로 보시면 이해하실 수 있을 것 입니다.

코드

public class Main {
	public static int N;
	public static int answer = 0;
	public static Stack<Character> stack = new Stack<>();
	public static StringBuilder sb = new StringBuilder();
	
    public static void main(String[] args) throws IOException{
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	StringTokenizer st = new StringTokenizer(br.readLine());
    	
    	//연속적으로 닫는것이 나오면 X이고, 한번 닫은후, 여는것이 나오면 더하기임.
    	String input = st.nextToken();
    	
    	int tempValue = 1;
    	for(int i=0;i<input.length();i++) { 
    		
    		if(input.charAt(i) == '(') { //'('를 만났을시에는 무조건 넣어줍니다.
    			stack.push('('); 
    			tempValue *= 2; //만약 '('를 만나면 우선 *2 로 진행합니다.   
    		}
    		
    		else if(input.charAt(i) == '[') { // '['를 만낫을시에는 무조건 넣어줍니다.
    			stack.push('[');
    			tempValue *= 3; //만약 '['를 만나면 우선 *3 로 진행합니다.
    		}
    		
    		else if(input.charAt(i) == ')') {
    			if(stack.isEmpty() || stack.peek() != '(') { //만약 ')'를 만났는데 전의 Stack값이 '('가 아니라면 틀린 문자열
    				answer = 0;
    				System.out.println("0");
    				return ;
    			}else if(input.charAt(i-1) == '(') { //만약 '[ ( ) ] 와 같은형태라고 가정해보자. 여기서  )를 만났을겨웅 이전의 값이 ( 이므로 해당값을 answer에 더해줍니다.
    				answer += tempValue;
    			}
    			stack.pop();
    			tempValue /= 2;
    		}
    		
    		else if(input.charAt(i) == ']') {
    			if(stack.isEmpty() || stack.peek() != '[') {
    				answer = 0;
    				System.out.println("0");
    				return ;
    			}else if(input.charAt(i-1) == '[') {
    				answer += tempValue;
    			}
    			stack.pop();
    			tempValue /= 3;
    		}
    	}
    	if(!stack.isEmpty()) System.out.println("0");
    	else System.out.println(answer);
    }
    
}

 

 

처음에 잘못푼코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Stack;
import java.util.StringTokenizer;

public class Main {
	public static int N;
	public static int answer = 0;
	public static Stack<Character> stack = new Stack<>();
	public static StringBuilder sb = new StringBuilder();
	
    public static void main(String[] args) throws IOException{
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	StringTokenizer st = new StringTokenizer(br.readLine());
    	
    	//연속적으로 닫는것이 나오면 X이고, 한번 닫은후, 여는것이 나오면 더하기임.
    	String input = st.nextToken();
    	
    	for(int i=0;i<input.length();i++) {
    		boolean meetFlag = false;
    		
    		if(input.charAt(i) == '(') {
    			stack.push('(');
    			meetFlag = false;
    		}
    		
    		else if(input.charAt(i) == '[') {
    			stack.push('[');
    			meetFlag = false;
    		}
    		
    		else if(input.charAt(i) == ')' && meetFlag == false) {
    			stack.pop();
    			answer += 2;
    			meetFlag = true;
    		}else if(input.charAt(i) == ')' && meetFlag == true) {
    			stack.pop();
    			answer *= 2;
    			meetFlag = true;
    		}
    		
    		else if(input.charAt(i) == ']' && meetFlag == false) {
    			stack.pop();
    			answer += 3;
    			meetFlag = true;
    		}else if(input.charAt(i) == ']' && meetFlag == true) {
    			stack.pop();
    			answer *= 3;
    			meetFlag = true;
    		}
    		
    	}
    	
    	System.out.println(answer);
    }
    
}

+ Recent posts