[BAEKJOON 9012번 : 괄호]
[문제]

[고찰]
저는 해당 문제에 대해서 정수형 count 변수를 선언한 후, ' ( '가 나오면 count++을 해주고, ' ) '가 나오면 count--를 해주는 방식으로 하여 count가 0일 때 해당 문자열이 VPS라는 아이디어로 풀었습니다.
다만, 다른 분들의 풀이를 보니 스택으로 해당 문제를 풀었고, 문제의 알고리즘 분류에도 스택이 있어 스택으로도 풀어보려고 합니다.
아래는 괄호를 카운트하는 방식으로 푼 제 코드입니다.
#include <iostream>
#include <string>
using namespace std;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int t;
cin >> t;
while (t--)
{
string str;
int count = 0;
cin >> str;
for (char c : str)
{
if (c == '(')
count++;
if (c == ')')
count--;
if (count < 0)
break;
}
cout << ((count == 0) ? "YES" : "NO") << '\n';
}
return 0;
}
[개념]
먼저 스택의 개념을 정리하고자 합니다.
Stack
스택은 컨테이너 어댑터(Container Adapter)입니다.
이는 특정 컨테이너의 기능을 제한하여 특정 데이터 구조의 인터페이스를 제공하는 클래스입니다.
문법
#include <stack>
stack<int> s; // int형 스택
stack<string> st; // string형 스택
stack은 <stack> 헤더에 정의되어 있으며,
LIFO (Last In, First Out), 후입선출의 구조로, 마지막에 넣은 데이터가 가장 먼저 나오는 자료구조입니다.
템플릿 매개변수
template <class T, class Container = std::deque<T>>
class stack;
- T : 스택에 저장될 요소의 타입입니다.
- Container : 스택의 내부 구현에 사용될 컨테이너의 타입입니다. 기본값은 std::deque<T>입니다.
- 해당 매개변수에 std::deque<T> 대신 std::vector<T>나 std::list<T>를 지정할 수 있습니다.
주요 함수
- st.push(x) : 스택의 맨 위에 x를 추가
- st.pop( ) : 맨 위 요소 제거
- st.top( ) : 맨 위 요소 반환
- st.empty( ) : 스택이 비어있는지 확인하여 true 또는 false 반환
- st.size( ) : 현재 스택에 들어있는 요소 개수 반환
이제 스택을 활용하여 해당 문제를 푸는 방법을 정리해보겠습니다.
char형 스택을 생성한뒤, 입력 받은 문자열을 for문으로 반복하면서, ' ( '면 push, ' ) '면 pop을 하는 것이 기본 아이디어입니다.다만, ' ) '일 때, 스택이 비어있다면 카운트 방식으로 따졌을 때 count가 0 이하가 되는 것이기 때문에, 이때는 push를 해주고 for문 반복을 break를 통해 멈춰줍니다.
이후 스택이 비었는지 안비었는지에 따라 YES 또는 NO를 출력해주면 됩니다.
이를 코드로 표현하면 아래와 같습니다.
stack<char> st;
string str;
cin >> str;
for (char c : str)
{
if (c == '(')
{
st.push(c);
}
else
{
if (st.empty())
{
st.push(c);
break;
}
st.pop();
}
}
cout << (st.empty() ? "YES" : "NO") << '\n';
[정리]
실버 4가 되니, 슬슬 자료구조에 대해 나오는 것 같습니다.
앞으로 컨테이너 클래스 템플릿에 관해서도 정리해야겠습니다.
[Solution]
#include <iostream>
#include <string>
#include <stack>
using namespace std;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int t;
cin >> t;
while (t--)
{
stack<char> st;
string str;
cin >> str;
for (char c : str)
{
if (c == '(')
{
st.push(c);
}
else
{
if (st.empty())
{
st.push(c);
break;
}
st.pop();
}
}
cout << (st.empty() ? "YES" : "NO") << '\n';
}
return 0;
}
'코딩 테스트' 카테고리의 다른 글
| [코딩테스트 37일차] BAEKJOON 2563번 : 색종이 (1) | 2025.06.28 |
|---|---|
| [코딩테스트 36일차] BAEKJOON 1436번 : 영화감독 숌 (0) | 2025.06.27 |
| [코딩테스트 35일차] BAEKJOON 10814번 : 나이순 정렬 (0) | 2025.06.24 |
| [코딩테스트 34일차] BAEKJOON 11650번 : 좌표 정렬하기, 1193번 : 분수찾기 (0) | 2025.06.23 |
| [코딩테스트 33일차] BAEKJOON 1181번 : 단어 정렬 (0) | 2025.06.21 |