ALGORITHM/Inflearn
[백준 10799] 쇠막대기 (스택)
Harimad
2022. 3. 4. 14:14

출처 링크: https://www.acmicpc.net/problem/10799
10799번: 쇠막대기
여러 개의 쇠막대기를 레이저로 절단하려고 한다. 효율적인 작업을 위해서 쇠막대기를 아래에서 위로 겹쳐 놓고, 레이저를 위에서 수직으로 발사하여 쇠막대기들을 자른다. 쇠막대기와 레이저
www.acmicpc.net
문제

예제 입력 1 - 한 줄에 쇠막대기와 레이저의 배치를 나타내는 괄호 표현이 공백없이 주어진다. 괄호 문자의 개수는 최대 100,000이다.
()(((()())(())()))(())
예제 출력 1 - 잘려진 조각의 총 개수를 나타내는 정수를 한 줄에 출력한다.
17
풀이

0. stack 배열을 생성하고, answer 를 0으로 초기화 시킨다.
1. 입력되는 문자열을 반복순회한다.
2. 문자열의 한 요소가 여는 괄호 ' ( '일때는 stack에 push한다.
3. 그 요소가 ' ) '일때는 먼저 stack에서 pop한다.
3-1. 그 요소의 바로 앞 요소(문자열[i-1])가 ' ( ', 즉 레이저를 닫는 괄호 일때는 answer에 stack.length 를 더해준다.
3-2. 그 요소의 바로 앞 요소가 ' ( ', 막대기의 끝 일때는 answer에 1만 더해준다.
코드
<script>
function solution(s) {
let answer = 0;
let stack = [];
for (let i = 0; i < s.length; i++) {
if (s[i] === '(') {
stack.push(s[i]);
} else {
stack.pop();
if (s[i - 1] === '(') answer += stack.length;
else if (s[i - 1] === ')') answer += 1;
}
}
return answer;
}
let a = "()(((()())(())()))(())";
console.log(solution(a));
</script>