본문 바로가기

PS_Baekjoon

[백준 C++] 10799번 : 쇠막대기

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