https://www.acmicpc.net/problem/10799
10799번: 쇠막대기
여러 개의 쇠막대기를 레이저로 절단하려고 한다. 효율적인 작업을 위해서 쇠막대기를 아래에서 위로 겹쳐 놓고, 레이저를 위에서 수직으로 발사하여 쇠막대기들을 자른다. 쇠막대기와 레이저
www.acmicpc.net
풀이 :
- 스택의 특성을 이용한 문제
이해하기 쉽게 스택을 이용해서 설명했지만, 스택을 사용하지 않고 변수를 하나 선언하고 카운트를 하는 방식으로 풀 수 있다
- 막대기가 시작하는 지점과 끝나는 지점의 특징 , 잘리는 시점에 막대기의 상태를 생각해야 한다.
- (가 나왔는데 다음 문자가
)라면 ()로, 레이저의 절단 지점
(라면 막대기의 시작 부분
- )가 나왔는데 이전 문자가
(라면 ()로, 레이저의 절단 지점
)라면 막대기가 끝나는 부분
- 막대기가 시작될 때마다 스택을 쌓고, 절단이 되면 스택이 쌓인 부분 만큼 잘리게 되니까 스택의 사이즈를 더한다
- 막대기가 끝나면 잘린 여부와 상관없이 스택 하나를 지우고 하나를 더한다
- 1번의 레이저는 쌓인 막대기가 없어서 아무런 일이 일어나지 않는다
- (가 3번 연이어 등장함으로, 1번, 2번, 3번 막대기가 시작되어 스택에 쌓인다
스택 : 3 정답 : 0
- 2번 레이저는 쌓인 막대기 3개를 자르게 된다. 자른 막대기의 갯수(스택의 사이즈)를 더한다
스택 : 3 정답 : 3
- 3번 레이저도 쌓인 막대기 3개를 자른다. 막대기의 갯수를 더한다
스택 : 3 정답 : 6
- )가 등장해서 제일 위에 쌓인 3번 막대기가 끝난다. 끝난 막대기의 갯수만큼 스택을 줄이고, 더한다
스택 : 2 정답 : 7
- (가 등장해서 4번 막대기가 시작되어 스택에 쌓인다
스택 : 3 정답 : 7
- 4번 레이저가 쌓인 막대기 3개를 자른다. 막대기의 갯수를 더한다
스택 : 3 정답 : 10
- )가 나와서 제일 위에 쌓인 4번 막대기가 끝난다. 끝난 막대기의 갯수만큼 스택을 줄이고, 더한다
스택 : 2 정답 : 11
- 5번 레이저가 쌓인 막대기 2개를 자른다. 막대기의 갯수를 더한다
스택 : 2 정답 : 13
- )가 2번 연이어 등장해서 2번, 1번 막대기가 끝난다. 끝난 막대기의 갯수만큼 스택을 줄이고, 더한다
스택 : 0 정답 : 15
- (가 나와서 5번 막대기가 시작되어 스택에 쌓인다
스택 : 1 정답 : 15
- 6번 레이저가 쌓인 막대기 1개를 자른다. 막대기의 갯수를 더한다
스택 : 1 정답 : 16
- )가 나와서 6번 막대기가 끝난다. 끝난 막대기의 갯수만큼 스택을 줄이고, 더한다
스택 : 0 정답 : 17
코드 :
#include <iostream>
#include <algorithm>
using namespace std;
int main(){
cin.tie(NULL);
ios::sync_with_stdio(false);
int n, ans = 0, cnt = 0;
string s;
cin >> s;
for(int i=0; i<s.size(); i++){
if(s[i] == '('){
if((i+1 < s.size()) && s[i+1] == ')'){ //(가 나왔고 다음 문자가 )라면,
if( cnt > 0){ //레이저가 나온 것
ans += cnt; //쌓인 막대기의 갯수를 더한다
}
}else{ //레이저가 아니라면
cnt++; //막대기를 쌓는다
}
}else{ //)가 나왔고
if(s[i-1] != '('){ //이전 문자가 (가 아니면, 막대기가 끝난 것
cnt--; //스텍을 하나 줄이고
ans++; //하나를 더한다
}
}
}
cout << ans << '\n';
}
'PS_Baekjoon' 카테고리의 다른 글
[백준 C++] 1120번 : 문자열 (0) | 2023.04.03 |
---|---|
[백준 C++] 1051번 : 숫자 정사각형 (0) | 2023.04.02 |
[백준 C++] 9625번 : BABBA (0) | 2023.03.31 |
[백준 C++] 9342번 : 염색체 (0) | 2023.03.30 |
[백준 C++] 17413번 : 단어 뒤집기 2 (0) | 2023.03.29 |