[백준 / JS] 2257 화학식량

Urther·2022년 8월 21일
0

알고리즘

목록 보기
41/41
post-thumbnail

Problem | 2257 화학식량

🕊 난이도

실버 2

📣 풀이 방법

엄청 헤맸다.

3가지의 경우로 생각해야한다.

  1. 현재 point 가 "(" 인 경우
  2. 현재 point가 ")" 인 경우
  3. "(" 도 아니고, ")"도 아닌 경우
  • 1번 일 경우,
    1.a ) 그냥 stack에 넣어준다.

  • 2번인 경우
    2.a ) stack에서 pop된 것이 "(" 일 때까지 pop해준다.
    2.b ) 만약, pop된 것이 숫자인 경우, stack의 최상단 숫자에 곱해서 다시 stack에 넣어준다.
    2.c ) pop된 것이 숫자가 아닌 경우, 그냥 sum 값에 더해준다.
    2.d ) pop된 것이 "(" 라면, 계산된 sum 값을 다시 push 해준다.

  • 3번인 경우
    3.a ) 포인트가 현재 숫자인 경우
    - stack에서 한 번 pop 해서 숫자만큼 곱해준 후 push
    3.b ) 포인트가 현재 영문인 경우, 값만큼 계산해준 후 push 해준다.

중요한 점은 stack에 영문 혹은 숫자가 아닌 계산된 값이 들어간다는 점이다

📄 전체 풀이

const input = require("fs")
  .readFileSync(process.platform === "linux" ? "dev/stdin" : "input.txt")
  .toString()
  .trim();

console.log(input);

const score = {
  H: 1,
  C: 12,
  O: 16,
};

const checkNumber = (i) => {
  const num = +i;

  if (num >= 0 && num <= 9) return true;

  return false;
};

const solution = () => {
  let answer = 0;
  let i = 0;
  let stack = [];

  while (true) {
    if (i === input.length) break;

    if (input[i] === "(") {
      stack.push("(");
    } else if (input[i] === ")") {
      let sum = 0;
      while (stack.length) {
        const x = stack.pop();
        if (x === "(") {
          // 계산하고 break
          stack.push(sum);
          break;
        }
        sum += x;
      }
    } else {
      if (checkNumber(input[i])) {
        const x = stack.pop();
        stack.push(x * +input[i]);
      } else {
        stack.push(score[input[i]]);
      }
    }

    i++;
  }

  while (stack.length) {
    answer += stack.pop();
  }

  return answer;
};

console.log(solution());
profile
이전해요 ☘️ https://mei-zy.tistory.com

0개의 댓글