개발자 미니민의 개발스터디

[백준 JAVA] 10799번 풀이 - 쇠막대기 (자료구조 점점 능숙해😇)

by mini_min

package baekjoon;

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

/** 
 * 쇠막대기 
 * 쇠막대기를 편하게 자르기 위해 아래에서 위로 겁쳐 놓고, 레이저를 위에서 수직으로 발사해서 
 * 쇠막대기를 자르려고 한다. 
 * 1. 쇠막대기는 자신보다 긴 쇠막대기 위에만 놓을 수 있다. 
 * 위에 놓는 경우 완전히 포함되도록 놓되, 끝점은 겹치지 않도록 놓는다. 
 * 2. 각 쇠막대기를 자르는 레이저는 적어도 하나 존재한다. 
 * 3. 레이저는 어떤 쇠막대기의 양 끝점과도 겹치지 않는다. 
 * 
 * 레이저는 () 을 표현한다. 
 * 
 * 쇠막대기는 ( 여는 괄호와 ) 닫는 괄호로 표현한다. 
 * 
 * 쇠막대기와 레이저 배치를 나타내는 괄호가 주어졌을 때,
 * 잘려진 쇠막대기 조각의 총 개수를 구하는 프로그램을 작성하시오. 
 * 
 */
public class _10799 {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		String problem = br.readLine();
		
		Stack<Character> stack = new Stack<>();
		int count = 0;
		for(int i=0; i<problem.length(); i++) {
			char c = problem.charAt(i);

			if(c=='(') {
				if(problem.charAt(i+1)==')') {
					if(!stack.isEmpty()) {
						count += stack.size();
					} else {
						count += 0;
					}
					i++; //건너뜀.
				} else {
					stack.push(c);
				}
				
			} else if (c==')') {
				count += 1;
				stack.pop();
			}
			
		}
		
		
		System.out.println(count);
		
		
		
	}

}

 

실버 2 라고 겁먹었는데

실버 2 난이도 문제라고 살짝 겁먹었는데... 

어떻게 풀어야할지 열심히 쳐다보고 고민했더니 금방 풀어냈다!

먼저, 경우의 수를 생각하고 ... 스택을 사용해야겠다고 생각하고...

해당 경우에 어떻게 스택을 활용할까? 생각했다!

 

풀이

(자르기!) -> stack size 값 3 개 짝둑. (3개)
(자르기!) -> stack size 값 3개 짝둑. (6개)
")" -> 1개 잘린 조각 획득. (stack -> 2) 됨 (7개) 
"(" -> 새로 들어옴. stack size 3개 됨 
(자르기!) -> stack size 값 3개 짝둑! (10개)
")" -> 1개 잘린 조각 획득. (stack -> 2) 됨 (11개)
(자르기!) -> stack size 값 2개 짝둑 (13개)
")" -> 1개 잘린 조각 획득 (stack -> 1) 됨 (14개)
")" -> 1개 잘린 조각 획득 (stack -> 0) 됨 (15개)
--|-- -> 조각 2개 획득. (17개)

 

1. 레이저 -> 자르기.
2. ( -> stack 에 넣기. 
3. ) -> stack 에서 빼고, 잘린 조각 추가. 

 

 

 

블로그의 정보

개발자 미니민의 개발로그

mini_min

활동하기