728x90
300x250
상세 풀이는 코드상에 주석으로 달아두었다.
누적합+스택을 이용하였다.
누적합 없이 레이저 관점에서 레이저 생성시점에 열려있는 쇠막대기들을 모두 자르는 방법도 있다.
<Java코드>
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
public class Main {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
Stack<Integer> stack = new Stack<Integer>();
int[] rsum = new int[100000];
int res = 0;
if (str.charAt(0) == '(') {
stack.push(0);
}
for (int i = 1; i < str.length(); i++) {
char ch = str.charAt(i);
if (ch == '(') {
// 여는괄호가 나오면 idx를 스택에 저장
stack.push(i);
rsum[i] = rsum[i - 1];
} else {
// 레이저 판별은 스택의 peek가 현재 idx과 1차이 나는지?\
// 레이저가 맞다면 레이저 갯수 누적합 배열에 +1
if (i - stack.peek() == 1) {
stack.pop();
rsum[i] = rsum[i - 1] + 1;
} else {
// 아니면 이전 누적합 숫자 그대로 이어갈것, 쇠막대기 만들어진 것으로 간주
rsum[i] = rsum[i - 1];
// 쇠막대기 길이구간 사이에 존재하는 레이저 갯수 파악하여 자른 조각 cnt
int start = stack.pop();
int sidx = start <= 0 ? 0 : start - 1;
res += rsum[i]-rsum[sidx]+1;
}
}
}
System.out.println(res);
}
}
728x90
'알고리즘 > 스택' 카테고리의 다른 글
백준 1874번: 스택 수열 [스택][Stack] -Java (0) | 2023.12.11 |
---|---|
백준 5397번: 키로거 [스택][Stack][덱][Deque][자료구조]- Java (0) | 2023.12.11 |
백준 4949번: 균형잡힌 세상[Stack][스택] -Java, 반례 (1) | 2023.12.05 |
백준 2841번: 외계인의 기타 연주 (0) | 2020.03.06 |
SWEA - 8931. 제로 (0) | 2020.02.29 |