본문 바로가기
알고리즘/자료구조

[백준][JAVA] 10799번 쇠막대기

by 박뀨뀨 2023. 12. 30.
 

10799번: 쇠막대기

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

www.acmicpc.net

코드

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

public class Main {
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		char[] str = br.readLine().toCharArray(); // 쇠막대기와 레이저의 배치를 나타내는 괄호 표현

		Stack<Integer> s = new Stack<>();
		
		int answer = 0; // 잘려진 조각의 총 개수
		int index = 0; // 인덱스
		
		for (int i = 0; i < str.length; i++) {
			if (str[i] == '(') { // (인경우
				s.push(index++); // 쇠막대기의 시작위치 인덱스 스택에 삽입
			} else { // )인경우
				if (index - s.peek() == 1) { // 레이저인 경우
					answer += s.size() - 1; // 쇠막대기의 개수만큼 총개수 누적
				} else { // 막대기끝인 경우
					answer++; // 1조각 누적
				}
				s.pop();
			}
		}
		
		System.out.println(answer); // 출력
	}

}

설명

'('인 경우 쇠막대기의 위치를 스택에 푸시

')'인 경우

- 1. '('와 인접한 쌍이면 레이저이므로 스택의 사이즈-1(잘린 쇠막대기 개수) 만큼을 누적해서 더해줌

- 2. 그외의 경우 쇠막대기의 끝이므로 1만큼 더해줌

728x90