본문 바로가기
알고리즘/백준

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

by 이민훈 2021. 4. 20.

www.acmicpc.net/problem/10799

 

10799번: 쇠막대기

여러 개의 쇠막대기를 레이저로 절단하려고 한다. 효율적인 작업을 위해서 쇠막대기를 아래에서 위로 겹쳐 놓고, 레이저를 위에서 수직으로 발사하여 쇠막대기들을 자른다. 쇠막대기와 레이저

www.acmicpc.net

풀이

 

입력으로 3가지의 경우가 입력될 수 있습니다.

 

1. 쇠막대기가 시작되는 부분 '('

 

2. 쇠막대기가 끝나는 부분 ')'

 

3. 레이저 "()"

 

레이저가 쇠막대기를 절단할 때 생기는 쇠막대기의 개수는 현재 쇠막대기가 몇 개 깔려있냐에 따라 다릅니다.

 

그림에서 처음 레이저를 발사할 때 총 3개의 쇠막대기가 깔려 있습니다.

 

'('가 3번 입력된 거죠.

 

그다음 레이저를 발사할 때도 동일하게 3개입니다.

 

그리고 쇠막대기가 끝나는 부분에도 절단된 쇠막대기가 1개 생깁니다.

 

#include<iostream>

using namespace std;

int main(void)
{
    string s; cin >> s;
    int len = s.length();

    int res = 0, tmp = 0;
    for (int i = 0; i < len; i++) {
        if (s[i] == '(') tmp++;
        else if (s[i] == ')' && s[i - 1] == '(') {
            tmp--;
            res += tmp;
        }
        else {
            tmp--;
            res += 1;
        }
    }

    cout << res;

    return 0;
}

반례

Input

(()()())

Output

4

 

Input

(((()()((((())())())())())))

Output

38

'알고리즘 > 백준' 카테고리의 다른 글

[백준/C,C++] 1260번: DFS와 BFS  (0) 2021.04.20
[백준/C,C++] 9465번: 스티커  (0) 2021.04.20
[백준/C,C++] 1850번: 최대공약수  (0) 2021.04.20
[백준/C,C++] 5585번: 거스름돈  (0) 2021.04.20
[백준/C,C++] 10610번: 30  (0) 2021.04.20

댓글