굳이 스택을 이용하지 않고 문자열만 다루어서 풀 수도 있는 문제였다.
여는 괄호는 일단 스택에 넣어준다.
그리고 닫는 괄호를 기준으로 생각해 보면, ( ) 처럼 연달아서 여는 괄호, 닫는 괄호가 나올 경우 레이저를 뜻하고, ) ) 처럼 닫는 괄호들이 이어진다면 이는 막대기의 끝 부분을 의미한다.
레이저의 경우는 현재 스택의 크기만큼의 조각이 생기고 (18번째 줄) , 막대기의 끝 부분일 경우 해당 막대기의 끝 부분, 즉 1개의 조각이 더 생긴다. (20번째 줄)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
#include <iostream>
#include <stack>
#include <string>
using namespace std;
int main() {
stack<char> pipes;
string inputStr;
int sum = 0;
cin >> inputStr;
for (int i = 0; i < inputStr.size(); i++) {
char ch = inputStr.at(i);
if (ch == '(')
pipes.push(ch);
else if (ch == ')') {
pipes.pop();
if (inputStr.at(i - 1) == '(') // 레이저
sum += pipes.size();
else if (inputStr.at(i - 1) == ')')
sum++;
}
}
cout << sum << endl;
}
|
cs |
'개발 > 알고리즘' 카테고리의 다른 글
[C++][백준 2178] 미로탐색 - 가중치가 없는 그래프의 최단경로? (0) | 2020.03.13 |
---|---|
[백준 5014][C++] 스타트 링크 (0) | 2020.02.09 |
[백준 2644][C++] 촌수계산 (0) | 2020.02.07 |
[백준 1005][C++] ACM Craft (0) | 2020.02.06 |
[백준 2493][C++] 탑 (0) | 2020.01.23 |
댓글