Study hard
(c++)백준 10799번: 쇠막대기 본문
https://www.acmicpc.net/problem/10799
10799번: 쇠막대기
여러 개의 쇠막대기를 레이저로 절단하려고 한다. 효율적인 작업을 위해서 쇠막대기를 아래에서 위로 겹쳐 놓고, 레이저를 위에서 수직으로 발사하여 쇠막대기들을 자른다. 쇠막대기와 레이저�
www.acmicpc.net


[풀이]
레이저가 나오면 레이저에 의해 잘린 레이저 왼쪽의 조각의 수를 더해주는 방법을 사용하였다.

1. '('가 나오면 막대 수 +1
2. ')'가 나오면 레이저인지 아닌지 판별 후, 레이저이면 조각 수 더해주고, 아니면 막대가 끝났음을 표시
※주의할 점※
-'()'가 나오면 레이저 이므로 '('에서 막대 수 +1 한 것을 다시 빼주어야 한다.
-막대가 끝나면 막대 수에서 빼는 걸로 끝나는 게 아니라 끝난 막대 수 +1을 해 주어야 밑의 그림에 표시된 O부분을 더해줄 수 있다.

#include <iostream>
#include <string>
using namespace std;
string str;
void solution() {
cin >> str;
int s = str.size();
int stick = 0;
int res = 0;
int endStick = 0;//끝난 막대기
for (int i = 0; i < s; i++) {
//새로운 막대가 나오면
if (str[i] == '(') {
stick++;
}
if (str[i] == ')') {
//레이저라면
if (str[i - 1] == '(') {
stick--;//직전에 센 건 막대가 아님
res += (stick + endStick);//레이저에 의해 만들어진 조각 개수 더하기
endStick = 0;
}
//막대가 끝난 거라면
else {
stick--;
endStick++;
}
}
}
res += endStick;//마지막 레이저 오른쪽에 남은 조각 더하기
cout << res << endl;
}
int main() {
solution();
return 0;
}
'백준 > 여러가지 문제들' 카테고리의 다른 글
(c++)백준 10866번: 덱 (0) | 2020.06.12 |
---|---|
(c++)백준 10845번: 큐 (0) | 2020.06.12 |
(c++)백준 9012번: 괄호 (0) | 2020.06.12 |
(c++)백준 10828번: 스택 (0) | 2020.06.11 |
(c++)백준 11004번: K번째 수 (0) | 2020.06.11 |