[BOJ] 2504번 - 괄호의 값

🔥 접근

  1. 스택에 현재 문자의 정보(문자와 인덱스)를 push하면서, 스택의 마지막 두 문자가 유효한 괄호 쌍이라면 pop 한다.
    • () 쌍이 완성되면 값 2,
    • [] 쌍이 완성되면 값 3을 할당하여 nums 배열에 저장한다.
    • 이때 저장하는 값에는 괄호 쌍의 시작 인덱스와 끝 인덱스(range) 도 함께 저장한다.
  2. 괄호 쌍의 range에 따라 연산 방식을 결정한다.
    • 괄호 쌍의 범위 길이가 1이라면 단순한 괄호 쌍이므로 덧셈 대상이 된다.
    • 범위 길이가 1보다 크다면, 내부에 포함된 이전 값을 곱 연산 처리한다.
      이때, nums 배열에서 해당 범위에 완전히 포함되는 값들을 찾아 곱셈 연산을 적용한다.
  3. 모든 괄호 쌍을 처리한 뒤 스택에 요소가 남아 있다면, 유효하지 않은 괄호 문자열이므로 결과는 0이다.
  4. 유효한 괄호 쌍들의 값을 모두 더한 결과를 반환한다.

🧑‍💻 코드

const fs = require('fs');

const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
const input = fs.readFileSync(filePath, 'utf8').toString().trim().split('');

const X = '()';
const Y = '[]';

const solution = (input) => {
  let pos = -1;
  const stack = [];
  const nums = [];

  input.forEach((s, idx) => {
    stack.push({
      symbol: s,
      idx,
    });

    pos += 1;

    if (pos <= 0) return;

    const fullSymbol = stack[pos - 1].symbol + stack[pos].symbol;

    if (fullSymbol === X) {
      nums.push({
        value: 2,
        range: [stack[pos - 1].idx, stack[pos].idx],
      });
      stack.pop();
      stack.pop();
      return (pos -= 2);
    }

    if (fullSymbol === Y) {
      nums.push({
        value: 3,
        range: [stack[pos - 1].idx, stack[pos].idx],
      });
      stack.pop();
      stack.pop();
      return (pos -= 2);
    }
  });

  if (stack.length > 0) return 0;

  const answerStack = [];
  nums.forEach((v) => {
    if (v.range[1] - v.range[0] === 1) answerStack.push(v);
    else {
      answerStack.forEach((item) => {
        if (item.range[0] > v.range[0] && item.range[1] < v.range[1])
          item.value *= v.value;
      });
    }
  });
  return answerStack.reduce((acc, cur) => acc + cur.value, 0);
};

console.log(solution(input));

🔗 관련 링크

'알고리즘 > 백준' 카테고리의 다른 글

[BOJ] 2217번 - 로프  (0) 2025.04.10
[BOJ] 1931번 - 회의실 배정  (0) 2025.04.10
[BOJ] 11047번 - 동전 0  (0) 2025.04.10
[BOJ] 9466번 - 텀 프로젝트  (0) 2025.04.09
[BOJ] 2206번 - 벽 부수고 이동하기  (0) 2025.04.08