Java/백준

[Java][10799] 쇠막대기

tmd1 2022. 8. 1. 19:47

문제:

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

 

10799번: 쇠막대기

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

www.acmicpc.net

코드:

import java.util.*;

public class Main {
    public static void main(String[] args) {
    	Scanner sc = new Scanner(System.in);
    	String s  = sc.next();
    	int cnt = 0;
    	
    	Stack st = new Stack<>();
    	for(int i=0;i<s.length();i++) {
    		if(s.charAt(i) == '(') {
    			st.push(s.charAt(i));
    		}else {
    			if(s.charAt(i-1) == '(') {
    				st.pop();
    				cnt += st.size();
    			}else {
    				st.pop();
    				cnt++;
    			}
    		}
    	}
    	System.out.println(cnt);
    }
}

 

 

 

( ( () ) ) 라는 예제가 주어졌다면 2개의 막대기 사이에 레이저를 발사하는 모형세가 된다.

막대기의 개수를 n 그 사이에 있는 레이저 개수를 m 이라고 할 때 나누어져 남는 총 막대기 개수는

 

n x (m+1) 개가 된다.

 

따라서 '(' 가 입력되었을 때 스택에 넣고 '('가 입력된 다음 ')'가 입력 되었을 시 레이저라고 생각한다.

레이저를 통해 나누어 졌으므로 스택 사이즈 만큼 cnt에 더해주고 (n x m) 나머지 쇠막대기 끝의 개수 만큼 더해주면

막대기의 총 개수를 셀 수 있다.