https://www.acmicpc.net/problem/10799
걸린 시간 : 6분 18초
어렵지 않았고, 발상도 쉬웠다. 문자열에서 문자를 처리하면서 발생할 수 있는 경우만 처리해주면 됐다.
스택을 사용할 수도 있지만, 그냥 변수를 사용해도 충분하다.
- 문자가 ( 이면 현재 막대기의 수를 나타내는 barnum을 증가시킨다.
- 문자가 ) 이면 다음 둘 중 하나이다.
- 직전 문자가 ( 이면 레이저를 나타낸다. 현재 막대기의 수만큼 잘린 막대기가 생길 것이다. 단, () 자체가 레이저인데 직전 문자인 ( 에서 barnum을 증가시켰으므로 먼저 barnum을 다시 감소시켜야 한다.
- 직전 문자가 ( 가 아니면 막대의 끝을 나타낸다. 막대 하나가 생기는 것으로 볼 수 있으므로 ans를 증가시킨다. 막대 하나가 끝났으므로 barnum도 감소시킨다.
#include <bits/stdc++.h>
using namespace std;
int main(void) {
ios::sync_with_stdio(0);
cin.tie(0);
string bar;
cin >> bar;
int barnum = 0, ans = 0;
for (int i = 0; i < bar.size(); i++) {
if (bar[i] == '(') {
barnum++;
}
else {
barnum--;
if (bar[i-1] == '(') {
ans += barnum;
}
else {
ans++;
}
}
}
ans += barnum;
cout << ans;
return 0;
}
'Baekjoon Online Judge' 카테고리의 다른 글
[BOJ] 2644: 촌수계산 (C++) (0) | 2023.08.06 |
---|---|
[BOJ] 4963 : 섬의 개수 (C++) with DFS (0) | 2023.08.06 |
[BOJ] 14500 : 테트로미노 (JAVA) with DFS (0) | 2023.08.03 |
[BOJ] 1941: 소문난 칠공주 (C++) with 조합 (0) | 2023.08.03 |
[BOJ] 2170 : 선 긋기 (C++) (0) | 2023.08.03 |