https://www.acmicpc.net/problem/2504
문제풀이
1. 올바른 문자열인지 아닌지 체크해준다.
2. 올바른 문자열이라면 다음 step으로, 아니라면 0을 출력한다.
3. (()[[]])([]) 이 입력으로 들어왔다고 생각을 하자.
여기서 아이디어는 ( 2 [3] 위와 같은 식으로 숫자를 저장하는것이다.
4. ) 또는 ] 이 나오게 된다면 앞서 (, [ 이 무조건 나올 것이다. 왜냐하면 이미 올바른 문자열인가를 체크를 한 상태이기 때문이다. 그렇다면 ) 또는 ] 나오게 된다면 그에 맞는 짝을 찾을때 까지 stack을 계속 pop 해준다.
그러면 두가지 케이스를 만날 수 있다.
4-1 앞서 저장해놓은 숫자를 만나는 경우.
4-2 바로 짝을 만나는 경우.
4-1 경우에는 tmp 에 숫자는 계속 더해준다. 그리고 마지막에 ) 이라면 2를곱해주고, ]이라면 3을 곱한 값을 stack에 넣는다.
4-2 경우에는 바로 2또는 3을 stack에 넣는다.
5-1 마지막은 (()[[]])([]) 같이 크게 두가지 괄호로 나누어진 경우에는 (()[[]]) ([]) 위 과정을 거치고 나면 stack에 [숫자, 숫자] 이렇게 저장되어 있으므로 모두 더한 값을 출력한다.
5-2 크게 (()[[]]) 한개의 괄호로 쌓여 있었다면 그대로 tmp를 출력한다.
const fs = require("fs");
BOJkey = 0;
let input = fs
.readFileSync(BOJkey ? "./자바스크립트로/2504/input.txt" : "./dev/stdin")
.toString()
.trim();
let stack = [];
let test = [1];
const rightCheck = () => {
for (let i = 0; i < input.length; i++) {
if (input[i] == "(" || input[i] == "[") {
stack.push(input[i]);
} else {
if (
stack.length > 0 &&
input[i] == ")" &&
stack[stack.length - 1] == "("
) {
stack.pop();
} else if (
stack.length > 0 &&
input[i] == "]" &&
stack[stack.length - 1] == "["
) {
stack.pop();
} else stack.push(input[i]);
}
}
return !(stack.length > 0);
};
let temp = [];
let sum = 0;
if (rightCheck()) {
for (let i = 0; i < input.length; i++) {
if (input[i] == "(" || input[i] == "[") {
stack.push(input[i]);
} else {
if (input[i] == ")") {
temp = [];
sum = 0;
while (true) {
target = stack.pop();
if (target == "(") {
if (temp.length == 0) {
stack.push(2);
} else {
temp.map((el) => (sum += el));
stack.push(2 * sum);
}
break;
} else {
temp.push(target);
}
}
} else if (input[i] == "]") {
temp = [];
sum = 0;
while (true) {
target = stack.pop();
if (target == "[") {
if (temp.length == 0) {
stack.push(3);
} else {
temp.map((el) => (sum += el));
stack.push(3 * sum);
}
break;
} else {
temp.push(target);
}
}
}
}
}
sum = 0;
stack.map((v) => (sum += v));
console.log(sum);
} else {
console.log(0);
}
'알고리즘 공부 > 미분류' 카테고리의 다른 글
백준 2580 스도쿠 파이썬 (0) | 2022.02.09 |
---|---|
백준 14888번 파이썬 (0) | 2022.02.09 |
백준 꽃길 14620번 파이썬 (0) | 2022.02.09 |
백준 선수과목 파이썬 (0) | 2022.01.28 |
bfs dfs (0) | 2022.01.14 |