Problem | 2257 화학식량
실버 2
엄청 헤맸다.
3가지의 경우로 생각해야한다.
- 현재 point 가 "(" 인 경우
- 현재 point가 ")" 인 경우
- "(" 도 아니고, ")"도 아닌 경우
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());