Deff_Dev
[백준] 10799번 쇠막대기 (C++) 본문
문제
풀이
이 문제는 쇠막대기를 레이저로 자를 떄, 몇 개의 막대기가 나오는지 출력하는 문제이다.
입력은 ' ( ' , ' ) ' 두 가지이다.
' ( ' 뒤에 바로 ' ) '가 온다면 해당 자리에 레이저를 쏜다는 것이고, 이외의 입력은 막대기를 의미한다.
ex) "(())" 입력은 ㅡ ㅡ 처럼 막대기 2개가 나온다.
예제의 입력을 본다면 위 그림과 같이 17개의 막대기가 나온다.
해결 방법
스택을 이용하여 풀이했고 입력을 받은 뒤, 입력된 문자열을 탐색하면서 레이저를 감별하고 막대기를 자른다.
- ' ( ' 이라면 bar 갯수를 + 1 한 뒤, 스택에 푸시한다. (flag 변수 true)
- ' ) '이라면 막대기 끝 or 레이저이기 때문에 bar 갯수를 - 1 한다.
- flag 변수가 true일 때는 레이저이기 때문에 현재 bar 갯수를 sum에 더한 뒤, flag 변수를 false로 바꾼다.
- flag 변수가 false일 때는 막대기가 끝난 것이므로 sum + 1 한다.
- 스택에서 ' ( ' 를 팝한다.
#include <bits/stdc++.h>
using namespace std;
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
string input;
cin >> input;
int sum = 0, bar = 0;
bool flag = false;
stack<char> stack;
for(int i = 0; i < input.length(); i++)
{
char c = input[i];
if(c == '(')
{
bar ++;
stack.push(c);
flag = true;
}
else
{
bar--;
if(flag) // 레이저일 때
{
sum += bar;
flag = false;
}
else sum += 1;
stack.pop();
}
}
cout << sum ;
return 0;
}
'코딩테스트 > 백준' 카테고리의 다른 글
[백준] 1926번 그림 (C++) (0) | 2025.01.14 |
---|---|
[백준] 2504번 괄호의 값 (C++) (0) | 2025.01.13 |
[백준] 4949번 균형잡힌 세상 (C++) (0) | 2025.01.07 |
[백준] 1021번 회전하는 큐 (C++) (0) | 2025.01.04 |
[백준] 2164번 카드 2 (C++) (0) | 2024.12.25 |