티스토리 뷰

https://www.acmicpc.net/problem/16637

 

16637번: 괄호 추가하기

첫째 줄에 수식의 길이 N(1 ≤ N ≤ 19)가 주어진다. 둘째 줄에는 수식이 주어진다. 수식에 포함된 정수는 모두 0보다 크거나 같고, 9보다 작거나 같다. 문자열은 정수로 시작하고, 연산자와 정수가

www.acmicpc.net

const fs = require('fs');
const input = fs.readFileSync("./dev/stdin").toString().trim().split("\n");
const N = Number(input[0])
const formula = input[1].split('');

let answer = -Infinity;

const signCnt = Math.floor(N / 2)

const Bracket = [];
for (let i = 0; i < 1 << signCnt; i++) {
  if (checkBracket(i)) {
    Bracket.push(i)
  }
}

Bracket.forEach(b => {
  const stack = [];
  let bracket = false;
  formula.forEach((f, i) => {
    if (isSign(f)) {
      if (isBracket(i, b)) {// 괄호일때.
        bracket = true;
      }
      stack.push(f)
    } else {
      if (bracket) {
        const sign = stack.pop();
        const prev = stack.pop();
        const now = f;
        const result = calc(prev, sign, now)
        stack.push(result)
        bracket = false;
      } else {
        stack.push(Number(f))
      }
    }
  })
  let res = +stack.shift();
  while (stack.length > 0) {
    const sign = stack.shift();
    const next = stack.shift();
    switch (sign) {
      case '+':
        res += Number(next);
        break;
      case '-':
        res -= Number(next);
        break;
      case '*':
        res *= Number(next);
        break;
    }
  }
  if (res > answer) answer = res;
})
console.log(answer)

function checkBracket(num) {
  let prev = 0;
  let loc = 0;
  let flag = true;
  let temp = num;
  while (temp > 0 && flag) {
    const now = temp & (1 << loc);
    if (prev == 1 && now == 1) {
      flag = false;
    } else {
      prev = now;
    }
    temp = temp >> 1;
  }
  return flag;
}

function isSign(c) {
  if (c == '+' || c == '-' || c == '*') {
    return true;
  }
  return false;
}

function isBracket(index, base) {
  const newIndex = (index - 1) / 2;
  if (base & (1 << newIndex)) { //괄호일때
    return true;
  } else { // 아닐 때 
    return false;
  }
}

function calc(prev, sign, now) {
  let ret;
  switch (sign) {
    case '+':
      ret = Number(prev) + Number(now);
      break;
    case '-':
      ret = Number(prev) - Number(now);
      break;
    case '*':
      ret = Number(prev) * Number(now);
      break;
  }
  return ret;
}
728x90
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함