2504カッコの値-javascript


📌 質問する
https://www.acmicpc.net/problem/2504

📌 に答える
const fs = require('fs');
const { exit } = require('process');
const filePath = process.platform === 'linux' ? '/dev/stdin' : 'input.txt';
let input = fs.readFileSync(filePath).toString().trim().split('\n');

let arr = input[0].split('');
let stack = [];

for (let i = 0; i < arr.length; i++) {
  if (stack.length === 0 && (arr[i] === ')' || arr[i] === ']')) {
    console.log(0);
    exit();
  }

  if (arr[i] === '(' || arr[i] === '[') stack.push(arr[i]);

  if (arr[i] === ')') {
    if (stack[stack.length - 1] === '(') {
      stack.pop();
      stack.push(2);
    } else if (
      stack[stack.length - 2] === '(' &&
      stack[stack.length - 1] !== '['
    ) {
      const num = stack.pop();
      stack.pop();
      stack.push(2 * num);
    } else {
      console.log(0);
      exit();
    }
  }

  if (arr[i] === ']') {
    if (stack[stack.length - 1] === '[') {
      stack.pop();
      stack.push(3);
    } else if (
      stack[stack.length - 2] === '[' &&
      stack[stack.length - 1] !== '('
    ) {
      const num = stack.pop();
      stack.pop();
      stack.push(3 * num);
    } else {
      console.log(0);
      exit();
    }
  }

  if (
    typeof stack[stack.length - 1] === 'number' &&
    typeof stack[stack.length - 2] === 'number'
  ) {
    const num = stack[stack.length - 1] + stack[stack.length - 2];
    stack.pop();
    stack.pop();
    stack.push(num);
  }
}
if (stack.length !== 1 || typeof stack[0] !== 'number') {
  console.log(0);
} else {
  console.log(stack[0]);
}
✔アルゴリズム:実装+スタック
✔入力終了の括弧ですがスタックが空では不可能なので0を出力します.

✔または]同じ状況の数量があります.
exの場合
  • スタックの最上位レベル(
    不可能である場合、出力0
  • スタックの最上位レベルが[時]
    この場合、[をポップアップして[]の3をスタック
  • にプッシュするだけです.
    if (arr[i] === ']') {
        if (stack[stack.length - 1] === '[') {
          stack.pop();
          stack.push(3);
        } 
      }
  • スタックの上部はnumber、2番目の上部は[時]
    pop 2回、push number*3
  • if (arr[i] === ']') {
      	 ... 위의 if 문 통과 후
         else if (
          stack[stack.length - 2] === '[' &&
          stack[stack.length - 1] !== '('
        ) {
          const num = stack.pop();
          stack.pop();
          stack.push(3 * num);
        } 
      }
  • スタックの上部は(時は|スタックの上部は数字、2番目の上部は(時は)
    不可能である場合、出力0
  • if (arr[i] === ']') {
         ... 위의 if 문 통과 후
         else {
          console.log(0);
          exit();
        }
      }
    ✔for文の最後に、常にstackの上部と下部をチェックして、カッコに複数の数字が含まれていないことを確認します.
    if (
        typeof stack[stack.length - 1] === 'number' &&
        typeof stack[stack.length - 2] === 'number'
      ) {
        const num = stack[stack.length - 1] + stack[stack.length - 2];
        stack.pop();
        stack.pop();
        stack.push(num);
      }
    100 stackの長さが1ではないか、長さが1ではないが、stack[0]が括弧の場合は無効な括弧である.
    if (stack.length !== 1 || typeof stack[0] !== 'number') {
      console.log(0);
    } 
    ✔以上の条件を通過すると、stackの長さが1、stack[0]がnumberとなるので、stack[0]を出力する
    ✔難易度:白駿基準シルバー2