코딩테스트/백준

백준 10799 : 쇠막대기 _자바 Java

플래시🦥 2023. 1. 28.
반응형

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

 

10799번: 쇠막대기

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

www.acmicpc.net


1. '('는 쇠막대기의 시작을 의미

2. ')'는 쇠막대기의 끝을 의미

3. 연속된 "()"는 레이저를 의미

 

'('일때 스택에 add 해주고,

')'라면 이전의 괄호가 '('이면 레이저를 의미하므로 시작한 레이저의 수 만큼 카운트 해서 잘린 막대기 수를 추가해 준다. 

-1을 해준 것은 레이저를 의미하는 괄호가 스택에 들어 갔기 때문에 빼준것이다. 먼저 pop 해주고 그냥 사이즈만큼 더해줘도 된다. 

그리고 쇠막대기의 끝을 의미하는 ')'라면 카운트+1을 해주고 스택에서 pop해서 막대기 개수를 줄여준다. 

(before 변수는 레이저인지 아닌지를 판별하기 위한 변수이다. )

 

import java.io.*;
import java.util.*;

public class Main {
	
	
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String str = br.readLine();
		br.close();
		
		Stack<Character> st = new Stack<>();
		int cnt=0;
		char before=' ';
		
		for(int i=0;i<str.length();i++) {
			if(str.charAt(i)=='(') {
				st.add(str.charAt(i));
			}
			else {
				if(before=='(') {
					cnt+=st.size()-1;
					st.pop();
				}else {
					cnt+=1;
					st.pop();
				}
			}
			before=str.charAt(i);
		}
		
		System.out.println(cnt);
	}// main()
	
	
}// class Main
728x90
반응형

댓글