[白俊]鉄棒#10799


説明:
以前プログラマーで解いた質問のタイプ(「既知」と呼ぶべきか...?)
問題があまりにも似ているので,解答を覚えて,そのとおりにした.
レーザーに相当する()の部分を別の文字に変えて、その文字をレーザーだと思って、答えに値を付けました.
レーザーに遭遇した場合は、これまで積み重ねたスタックに答えを付け、)に遭遇した場合は、答えに1を加えるだけでよい.
C++も同様であるがstring replace関数を用いず,現在見られている位置は(であり,次の位置が)であればレーザであると考えられる.
Node.説明する
const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString();
// test
// const input = `(((()(()()))(())()))(()())`;

const solution = (input) => {
  let stack = 0;
  let answer = 0;
  const str = input.replace(/\(\)/g, '0');
  [...str].forEach((ch) => {
    if (ch === '0') {
      answer += stack;
    } else if (ch === '(') stack += 1;
    else if (ch === ')') {
      stack -= 1;
      answer += 1;
    }
  });
  return answer;
};

console.log(solution(input));
C++プール
#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    string data; cin >> data;
    int answer = 0;
    int stack = 0;
    for (int i=0; i<data.length(); i++) {
        if (data[i] == '(') {
            if (i+1 < data.length() && data[i+1] == ')') {
                // 레이저
                answer += stack;
                i+=1;
            } else {
                stack += 1;
            }
        } 
        else if (data[i] == ')') {
            stack -= 1;
            answer += 1;
        }
    }
    cout << answer << '\n';
    return 0;
}