Baekjoon 10799 - 쇠막대기
Baekjoon 10799 - 쇠막대기
문제
Example Input/Output
1
2
3
4
5
6
7
8
// IN
// (): 레이저 (쇠막대기를 자를 수 있는)
// (: 쇠막대기 시작 (왼쪽 끝)
// ): 쇠막대기 끝 (오른쪽 끝)
()(((()())(())()))(())
// OUT
17 // 쇠막대기 조각 수
C++ 풀이
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
string s;
cin >> s;
int pipeCount = 0;
int score = 0;
bool lastOpen = false;
for (auto c: s)
{
if (c == '(')
{
score++;
lastOpen = true;
}
else
{
score--;
pipeCount += lastOpen ? score: 1;
lastOpen = false;
}
}
cout << pipeCount;
}
메모
- 레이저가 쇠막대기를 자르는 위치 표시
- 1~5번을 통해 규칙 찾기
- 코드로 옮기기
- 전제: 모든 문자열은 균형잡힌 괄호 문자열이다
- 각 문자에 대해 (
for
) - 문자가
(
면 점수 +1 - 문자가
)
면
- 일단 점수 -1
- 만약 이전 문자가
(
였다면 쇠막대기 += 현재 점수 - 아니라면 쇠막대기 += 1
- 각 문자에 대해 (
- 전제: 모든 문자열은 균형잡힌 괄호 문자열이다
- 원래 스택을 써서 풀었는데, 어차피 균형잡힌 문자열이라 굳이 스택을 쓰지 않아도 된다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.