https://www.acmicpc.net/problem/10799
괄호 모양을 보자마자 이건 스택
이다 라는 생각과 함께 문제를 접하였다. 로직은 별거 없다.
1. 우선 괄호가 '('가 나오면 스택에 추가한다.
2. 그리고 닫는 괄호 ')' 가 나오면 두가지 경우가 생긴다.
1) 레이저가 되어 모든 막대기를 다 자르는 경우
이럴 때에는 스택에 쌓은 '('의 개수 만큼 쇠막대기가 잘리기 때문에 스택의 길이만큼 쇠막대기 개수에 더해준다.
2) 막대기의 끝 부분이라 막대기 1개가 더 생기는 경우
이 경우는 쇠막대기 개수에 +1을 더해주면 된다.
const fs = require("fs");
const stdin = (
process.platform === "linux"
? fs.readFileSync("/dev/stdin").toString().trim()
: `(((()(()()))(())()))(()())`
).split("\n");
const input = (() => {
let line = 0;
return () => stdin[line++];
})();
const brackets = input().split("");
const stack = [];
let stickCnt = 0;
for (let i = 0; i < brackets.length; i++) {
if (brackets[i] === "(") {
stack.push(brackets[i]);
} else {
stack.pop();
if (brackets[i - 1] === "(") {
stickCnt += stack.length;
} else {
stickCnt += 1;
}
}
}
console.log(stickCnt);
문제를 처음 보았을 때 분명 스택인데.. 스택인데..? 어떻게 풀어야하지? 싶었다.
그림으로 스택을 그려서 ')'가 나왔을 때 어떤식으로 진행되는지를 파악하니 푸는 방법이 떠올랐다. 문제푸는 시간은 오래걸리지 않았지만 생각만으로도 1시간을 썼다.. 더 노력해야지!
나는 그래프 형식 말고는 다른 알고리즘 모두 새롭고 어렵기 때문에 자주 보고 익숙해져야겠다는 생각이 더욱 들었다. 매일매일 깨달음이 있다니..