대딩/백준BOJ풀이
[백준 10799번] 쇠막대기 풀이
경아ㅏ
2021. 9. 25. 20:36
10799번: 쇠막대기
여러 개의 쇠막대기를 레이저로 절단하려고 한다. 효율적인 작업을 위해서 쇠막대기를 아래에서 위로 겹쳐 놓고, 레이저를 위에서 수직으로 발사하여 쇠막대기들을 자른다. 쇠막대기와 레이저
www.acmicpc.net
"()"로 표시된 레이저가 쇠막대기를 자를 때 잘린 쇠막대기의 조각수를 구하는 문제이다.
무수히 많은 괄호로 묶여 있는 문제의 형태는 스택을 떠올리면 해결하기 쉽다.
이 문제는 문자열을 순회하면서 다음의 케이스를 처리한다.
1) '('가 등장할 때
2) ')' 가 등장할 때 - 레이저 표시를 위한 ')'
3) ')'가 등장할 때 - 열린 괄호를 닫기 위한 ')'
1번의 경우에는 스택에 '('를 쌓는다.
2번의 경우는 ')' 가 등장 하였을 때, 그 전 인덱스에 '(' 가 있으면 레이저로 판별할 수 있다. 레이저가 등장하였을 때는, 스택에 쌓인 것들 중에서 앞의 레이저 표시를 위해 등장했던 '(' 를 삭제하고 나머지 열린 괄호들의 개수들 만큼 만들어진 조각 수에 추가한다.
3번의 경우 ')'가 등장 하였을 때, 그 전 인덱스에 '('가 없으면 이는 열린 괄호를 닫기 위한 ')'라고 판별할 수 있다. 한개의 괄호가 닫혔으므로 스택에서 한개의 '(' 를 제거한다. 스택에는 현재까지 열려있는 괄호의 개수만 남게 되고, 괄호를 닫는 과정에서 한개의 막대 조각이 만들어지므로 만들어진 조각수를 1 증가시킨다.
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cmath>
#include <tuple>
#include <stack>
using namespace std;
int main() {
string s;
cin >> s;
int re = 0;
stack<char> st;
for (int i=0; i<s.size(); i++) {
if (s[i] == '(') st.push('(');
else {
st.pop();
if (s[i-1] == '(') re+=st.size();
else re++;
}
}
printf("%d", re);
return 0;
}