https://www.acmicpc.net/problem/2504
(()[]) 와같이 괄호가 주어지면 해당 괄호를 숫자로 치환후 계산을 하는 문제다.
() = 2, [] = 3로 치환후 ()() 이렇게 돼있으면 더하고 (()) 이렇게 중첩됐으면 곱한다.
위의(()[])
는(2 + 3) X 2
다.
입력
- 괄호열을 나타내는 문자열(스트링)이 주어진다. 단 그 길이는 1 이상, 30 이하이다.
출력
- 첫째 줄에 그 괄호열의 값을 나타내는 정수를 출력한다.
- 만일 입력이 올바르지 못한 괄호열이면 반드시 0을 출력해야 한다.
처음에는 스택을 두개 쓸 생각을 못했다.
그래서 문자열을 넣었다 뺏다 하는 스택 한개, 계산을 위한 스택같은 배열? 이렇게 두개를 썼는데
앞으로 문제를 풀때는 여러 방면으로 생각할 필요가 있을것같다.
이번엔 처음보다 채점이 꽤 많이 진행됐다. 40%쯤까지 채점이 진행된걸로 기억한다.
여러가지 예외를 생각해봤는데 마지막까지 생각못한 한가지가 있다.
바로 문자열 끝에 괄호가 있는거다.
이 예외는 아래처럼 처리하니 바로 통과했다.
return stack.length > 0 ? 0 : sum;
const stdin = (
process.platform === "linux"
? require("fs").readFileSync(0, "utf-8")
: `(()[[]])([])`
)
.trim()
.split("\n");
const input = (() => {
let line = 0;
return () => stdin[line++]; //.split(" ").map((v) => +v);
})();
const solution = (inp) => {
const stack = [];
const numStack = [];
const num = { "]": 3, ")": 2 };
let closeBefore = false;
let openBefore = false;
let sum = 0;
for (let str of inp) {
// console.log(numStack);
// 괄호 열기 = stack에 집어넣음
if (str === "(" || str === "[") {
if (openBefore) {
numStack.push(sum);
sum = 0;
}
stack.push(str);
openBefore = true;
closeBefore = false;
}
// 괄호 닫기 = stack에서 뺌.
else {
const pop = stack.pop();
// 앞의 괄호와 짝이 맞을경우
if ((str === ")" && pop === "(") || (str === "]" && pop === "[")) {
// 두번이상 닫는거라면
if (closeBefore) {
sum = sum * num[str] + numStack.pop();
}
// 처음 닫아보는거라면
else {
sum += num[str];
}
}
//짝이 맞지않으면 0 리턴
else {
return 0;
}
openBefore = false;
closeBefore = true;
}
}
return stack.length > 0 ? 0 : sum;
};
console.log(solution(input()));