[백준] 괄호의 값 #2504

welchs·2022년 1월 16일
0

알고리즘

목록 보기
12/44
post-thumbnail

설명

괄호쌍은 곧 Stack 문제이다.
문제는 숫자를 계산할 때 어떻게 하냐였는데 num이라는 변수의 초기값을 1로 셋팅하고([를 만나면 각각 2와 3을 곱해준다.
그러다가 )]를 만나면 계산한 값을 더해주고 각각 2와 3으로 다시 num을 나눠준다.
이때 값을 더해주는 경우는 현재 바라보고 있는 문자(ch)에서 이전 인덱스의 문자가 매칭되는 괄호일 경우에만 더해준다.

if (str[i - 1] === '(') answer += num;

Node.js 풀이

const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().trim();

const solution = (str) => {
  const stack = [];
  let answer = 0;
  let num = 1;
  for (let i = 0; i < str.length; i++) {
    const ch = str[i];
    if (ch === '(') {
      stack.push('(');
      num *= 2;
    } else if (ch === ')') {
      if (stack.length === 0) return 0;
      const top = stack.pop();
      if (top === '(') {
        if (str[i - 1] === '(') {
          answer += num;
        }
        num /= 2;
      } else {
        return 0;
      }
    } else if (ch === '[') {
      stack.push('[');
      num *= 3;
    } else if (ch === ']') {
      if (stack.length === 0) return 0;
      const top = stack.pop();
      if (top === '[') {
        if (str[i - 1] === '[') {
          answer += num;
        }
        num /= 3;
      } else {
        return 0;
      }
    }
  }
  if (stack.length !== 0) return 0;
  return answer;
};

console.log(solution(input));

C++ 풀이

#include <bits/stdc++.h>
using namespace std;

int solution(string str) {
    stack<char> S;
    int sum = 0;
    int num = 1;
    for (int i=0; i<str.length(); i++) {
        char ch = str[i];
        if (ch == '(') {
            num *= 2;
            S.push('(');
        }
        else if (ch == '[') {
            num *= 3;
            S.push('[');
        }
        else if (ch == ')') {
            if (S.empty() || S.top() != '(') return 0;
            S.pop();
            if (str[i-1] == '(') {
                sum += num;
            }
            num /= 2;
        }
        else if (ch == ']') {
            if (S.empty() || S.top() != '[') return 0;
            S.pop();
            if (str[i-1] == '[') {
                sum += num;
            }
            num /= 3;
        }
    }
    if (!S.empty()) return 0;
    return sum;
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    string str; cin >> str;
    cout << solution(str) << '\n';
    return 0;
}
profile
고수가 되고 싶은 조빱

0개의 댓글