
https://www.acmicpc.net/problem/10799
일단 문제에서 묻는 게 뭔지부터 이해가 되지 않았다 . .
괄호 문제랑 비슷하게 생각하면 될 것 같았는데, 그래서 쇠막대기 수를 어떻게 세어야할지 도통 감이 오지 않았다..ㅠㅠ.....
유레카 강사님의 도움을 받아 겨우겨우 문제를 이해하는 데에 성공했다 ..
괄호를 연다: 레이저의 시작 or 쇠막대기의 시작
괄호를 닫는다: 레이저를 쏜다 or 쇠막대기가 끝난다
일단 주어진 상태는 이렇고, 여기서 괄호를 닫는 것에 집중해야한다. 왜냐하면 레이저를 쏘거나 쇠막대기가 끝나는 경우에는 더이상 잘라지지 않는 막대기가 발생하기 때문이다.

하늘색이 레이저를 쏘아서 더이상 잘리지 않는 쇠막대기가 발생한 경우,
분홍색이 쇠막대기가 끝나서 더이상 잘리지 않는 쇠막대기가 발생한 경우이다.
- 스택에 괄호 정보를 차례대로 넣는다.
(인 경우에는 항상 push한다.)인 경우
- 이전 문자가
(라면, pop하고 스택의 길이를 더한다.- 이전 문자가
)라면, pop하고 1을 더한다.
이 때 더하는 숫자가 왜 이렇게 되는지 좀 더 자세히 설명하자면,
(는 쇠막대기의 시작을 나타낸다.(=쌓을 수 있는 쇠막대기의 수)
()가 되어 레이저를 쏘게 된다. 레이저를 쏘는 데에 사용된 (는 쇠막대기로써 카운팅하면 안되니 pop한다. 쇠막대기의 시작 ~ 레이저(쇠막대기 잘림)이기 때문에, 스택의 길이(레이저를 쏘는 위치에 쌓여있는 쇠막대기의 수)만큼 더이상 잘리지 않는 쇠막대기가 발생한다.
쇠막대기가 끝나는 지점을 의미한다. 더이상 잘리지 않는 쇠막대기가 발생하는데, 이건 어떤 한 쇠막대기가 잘려진 마지막 조각이다. 그렇기 때문에 ((쇠막대기로써 카운팅되는 값)을 하나 pop한다. 그리고 이는 더이상 잘리지 않는 쇠막대기가 1개 발생한 것이다.

문제 해석하는 데에 시간을 정말정말정말 많이 썼다 ..
그래도 다행인 건 문제를 이해한 후에 이 조건을 구현하는 것은 크게 어렵지 않았다 !!
문자가 )인 경우를 먼저 조건에 따라 분기처리하고, (인 경우는 else문으로 묶어서 push해주면 된다.
const stack = [];
let cnt = 0;
function solution(string) {
for (let i = 0; i < string.length; i++) {
if (string[i] == ")") {
stack.pop();
if (string[i - 1] == "(") {
cnt += stack.length;
} else if (string[i - 1] == ")") {
cnt++;
}
} else stack.push(string[i]);
}
return cnt;
}
// =====입출력=====
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
rl.on("line", (string) => {
console.log(solution(string));
rl.close();
});
