[210323][백준/BOJ] 10799번 쇠막대기

KeonWoo Kim·2021년 3월 23일
0

알고리즘

목록 보기
24/84

문제

입출력


풀이

') 을 입력받았을때 이것이 레이저를 나타내는지 막대기가 끝나는지를 구분하면 문제를 풀 수 있다.
')' 이 나올때
앞의 값이 '(' 라면 레이저이므로 stack의 사이즈만큼 결과값에 더한다.
앞의 값이 ')' 라면 막대기가 끝나는 것이므로 1을 더한다.

  1. '(' 을 만나면 push를 한다. 다음 ')' 을 만나서 pop을 한다. 이전값이 '(' 이며 레이저를 나타내므로 사이즈인 0을 더한다.

  2. '(' 가 4개연속 나오므로 push를 4번하고 사이즈는 4가 된다.
    다음으로 ')' 이 나오므로 pop을 한다. 이전값이 '(' 이며 레이저를 나타내므로 사이즈인 3을 더한다. '(' 가 나오므로 push를 하고 다시 ')'이 나오므로 pop을 하며 레이저를 나타내므로 사이즈인 3을 더한다.
    ')' 이 나와서 pop을 하며 이전 값이 ')' 이므로 막대기가 끝나게 된다. 사이즈는 2개 되며 1을 더한다.

  3. '(' 이 2개연속 나오므로 push를 2번 하고 사이즈는 4가 된다.
    ')' 이 나오므로 pop을 하고 이전값이 '(' 이므로 레이저를 나타내니 사이즈인 3을 더한다.
    다음 ')' 이 나오므로 pop을 하고 이전값이 ')' 이므로 막대기가 끝나게 된다. 사이즈는 2가 되며 1을 더한다.

  4. '(' 이 나오므로 push를 하고 ')' 이 나오므로 pop을 한다. 이전값이 '(' 이므로 레이저를 나타내며 사이즈인 2를 더한다. ')' 이 2개 연속 나오므로 pop을 2번 하여 사이즈는 0이 되며 2를 더한다.

  5. '(' 이 2번연속 나오므로 push를 2번 하고 ')' 이 나오므로 pop을 한다. 사이즈인 1을 더하며 다음으로 ')' 이 나오므로 막대기가 끝나게 되며 1을 더한다.

  6. 따라서 총 17이 나오게 된다.

코드

#include <bits/stdc++.h>
using namespace std;

int main(void)
{
	stack<char>s;
	string str;
	cin >> str;
	int res = 0;
	for (int i = 0; str[i]!='\0'; ++i)
	{
		if (str[i] == '(')
			s.push(str[i]);
		else
		{
			s.pop();
			
			if (str[i-1] == '(')
				res += s.size();
			else if(str[i-1] == ')')
				res += 1;
		}
	}
	cout << res << '\n';
}
profile
안녕하세요

0개의 댓글

관련 채용 정보