문제 링크
문제 설명
여러 개의 쇠막대기를 레이저로 절단하려고 한다. 효율적인 작업을 위해서 쇠막대기를 아래에서 위로 겹쳐 놓고, 레이저를 위에서 수직으로 발사하여 쇠막대기들을 자른다. 쇠막대기와 레이저의 배치는 다음 조건을 만족한다.
쇠막대기는 자신보다 긴 쇠막대기 위에만 놓일 수 있다. - 쇠막대기를 다른 쇠막대기 위에 놓는 경우 완전히 포함되도록 놓되, 끝점은 겹치지 않도록 놓는다.
각 쇠막대기를 자르는 레이저는 적어도 하나 존재한다.
레이저는 어떤 쇠막대기의 양 끝점과도 겹치지 않는다.
아래 그림은 위 조건을 만족하는 예를 보여준다. 수평으로 그려진 굵은 실선은 쇠막대기이고, 점은 레이저의 위치, 수직으로 그려진 점선 화살표는 레이저의 발사 방향이다.
이러한 레이저와 쇠막대기의 배치는 다음과 같이 괄호를 이용하여 왼쪽부터 순서대로 표현할 수 있다.
레이저는 여는 괄호와 닫는 괄호의 인접한 쌍 ‘( ) ’ 으로 표현된다. 또한, 모든 ‘( ) ’는 반드시 레이저를 표현한다.
쇠막대기의 왼쪽 끝은 여는 괄호 ‘ ( ’ 로, 오른쪽 끝은 닫힌 괄호 ‘) ’ 로 표현된다.
위 예의 괄호 표현은 그림 위에 주어져 있다.
쇠막대기는 레이저에 의해 몇 개의 조각으로 잘려지는데, 위 예에서 가장 위에 있는 두 개의 쇠막대기는 각각 3개와 2개의 조각으로 잘려지고, 이와 같은 방식으로 주어진 쇠막대기들은 총 17개의 조각으로 잘려진다.
쇠막대기와 레이저의 배치를 나타내는 괄호 표현이 주어졌을 때, 잘려진 쇠막대기 조각의 총 개수를 구하는 프로그램을 작성하시오.
입력
한 줄에 쇠막대기와 레이저의 배치를 나타내는 괄호 표현이 공백없이 주어진다. 괄호 문자의 개수는 최대 100,000이다.
출력
잘려진 조각의 총 개수를 나타내는 정수를 한 줄에 출력한다.
구조화
'(' 왼쪽 괄호 다음 바로 ')' 오른쪽 괄호가 들어온 경우만 레이저가 나옴
이를 boolean 배열에 저장
나머지는 '(' 들어온 순간부터 몇번의 레이저가 나왔는 지 알아야 자를 수 있기 때문에
레이저를 제외한 경우에 스택에 언제 '('가 들어왔는 지 인덱스 저장 후,
')'가 들어왔을 때 이를(인덱스 출발과 끝) list에 저장
list를 순회하면서 각 경우의 길이마다 boolean 배열를 탐색해서 cnt
오답 노트
자를 때는 레이저 횟수 +1을 해야함
소스 코드
import java.io.*;
import java.util.*;
public class Main {
public static class Node {
int start;
int end;
public Node(int start, int end) {
this.start = start;
this.end = end;
}
}
public static void main(String[] args) throws IOException {
int ans = 0;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
int n = str.length();
boolean[] r = new boolean[n];
List<Node> nodes = new ArrayList<>();
Stack<Integer> stack = new Stack<>();
stack.add(0);
for (int i = 1; i < n; i++) {
if (str.charAt(i)=='(') {
stack.add(i);
}
if (str.charAt(i)==')') {
int in = stack.pop();
if (str.charAt(i-1)=='(') {
r[i] = true;
continue;
}
nodes.add(new Node(in, i));
}
}
for (Node node : nodes) {
int tmp = 0;
for (int i = node.start; i <= node.end; i++) {
if (r[i]) tmp++;
}
ans += tmp+1;
}
System.out.println(ans);
}
}
'Algorithm > 백준' 카테고리의 다른 글
[백준] 14425 문자열 집합 🗂 (Java) (0) | 2024.04.27 |
---|---|
[백준] 2630 색종이 만들기 📜 (Java) (0) | 2024.04.26 |
[백준] 16397 탈출 🚪 (Java) (0) | 2024.04.25 |
[백준] 16170 오늘의 날씨는? ☀️ (Java) (0) | 2024.04.23 |
[백준] 2294 동전 2 💰 (Java) (0) | 2024.04.21 |