본문 바로가기
Problem Solving/Baekjoon

[백준] 10799 쇠막대기 - Data Structure / Java

by graycode 2022. 6. 17.

 문제 링크

 

10799번: 쇠막대기

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

www.acmicpc.net

 

 풀이 과정

 

기본적으로 9012번 문제와 유사한 문제이다

 

[백준] 9012 괄호 - Data Structure / Java

• 문제 링크 9012번: 괄호 괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄

graycode.tistory.com

 

입력받은 문자가 '(' 일 경우 스택에 push() 하고 ')' 일 경우 pop() 을 하는 로직은 동일하나

pop() 을 한 후 이전에 입력된 문자가 '(' 일 경우 레이저를 의미하므로 현재 스택의 크기만큼 result 변수에 더해주며

그 외의 경우 막대를 의미하므로 result++ 을 수행한다.

 

이렇게 막대를 교차하지 않는 레이저, 이미 절단한 막대와 레이저까지 차례대로 제거되며

범위 내에서 절단한 막대의 총 개수가 결과 값으로 출력된다.

 

 풀이 코드

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

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

		Stack<Character> stk = new Stack<>();
		char[] input = br.readLine().toCharArray();

		int result = 0;
		for (int i = 0; i < input.length; i++) {
			if (input[i] == '(')
				stk.push(input[i]);
			if (input[i] == ')') {
				stk.pop();
				if (input[i - 1] == '(')
					result += stk.size();
				else
					result++;
			}
		}

		bw.write(result + "\n");
		bw.flush();
	}

}

댓글