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

 

10799번: 쇠막대기

여러 개의 쇠막대기를 레이저로 절단하려고 한다. 효율적인 작업을 위해서 쇠막대기를 아래에서 위로 겹쳐 놓고, 레이저를 위에서 수직으로 발사하여 쇠막대기들을 자른다. 쇠막대기와 레이저

www.acmicpc.net

코드설명

스택 자료구조를 활용합니다.

문제로직입니다.

1. '('를 만나면 Stack에 넣습니다.

2. ')'를 만나면 2가지로 나눠집니다.

        2-1. '()' 인경우, 즉 레이저인경우는 우선 Stackpop 한뒤 현재 Stack.Size = 쇠막대기 자르는 개수

        2-2. '( ( ) )' 인경우에서 바깥쪽 괄호를 의미합니다 이 경우 전체 쇠막대기를 자르는것이 아닌 1개만 남은 것을 자르는것이므로 +1 만 처리합니다.

 

코드

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());
    	
    	String input = st.nextToken();
    	for(int i=0;i<input.length();i++) { //문제에서 레이저를 만날때만 Stack의 Size만큼 더해주고, 레이저가 아닌 잘린 막대기인 경우 ')' 일경우 +1 처리하여 진행합니다.
    		if(input.charAt(i) == '(') {  //'(' 라면 Stack에 추가합니다.
    			stack.push(')');
    		}
    		else if(input.charAt(i) == ')') { //')'라면 Stack에 추가합니다.
    			stack.pop(); // ')'를 만났으니 '(' 한개를 뻅니다.
    			
    			if(input.charAt(i-1) == '(') { // 만약 '()' 모양이라면 레이저이므로 Stack의 크기만큼 더합니다.
    				answer += stack.size();
    			}else { //만야 '(())' 이런 형태이면 밖의 괄호는 레이저가 아닌, 쇠막대기입니다. +1 처리합니다.
    				answer += 1;
    			}
    			
    		}
    	}
    	
    	System.out.println(answer);
    }
    
}

+ Recent posts