목차
백준 단계별로 풀어보기
25.11.16
16단계: 스택, 큐, 덱 1
9012번: 괄호
문제 링크 : https://www.acmicpc.net/problem/9012
문제를 풀기 위해 알아야 할 개념
>> Stack
: 아래 글에 정리해두었다.
자료구조
목차Stack: Last In First Out (LIFO) 원칙을 따르는 자료구조 >> 주요 메서드Push(x) : 주어진 요소 x를 Stack의 맨 위에 추가한다.Pop() : Stack이 비어있지 않으면 맨 위에 있는 요소를 삭제하고 반환한다.Peek()
mobics.tistory.com
문제 풀이
: 괄호의 모양이 바르게 구성되어있는지 확인하려면 '(' 마다 Stack에 추가하고, '(' 뒤에 나오는 ')' 마다 마지막으로 추가한 '(' 를 빼는 과정을 반복했을 때, 최종적으로 Stack에 남아있는 괄호가 없으면 VPS이다. 이때, Stack에 '(' 가 없을 때 ')' 가 나오면 무조건 VPS일 수 없다.
- StreamReader로 입력값을 받아 int값으로 변환하여 테스트 데이터의 수를 담을 변수 t 에 담고, '('를 담을 char 형 Stack stack 을 초기화한다.
- for 반복문을 통해 아래 과정을 반복하여 입력값이 VPS인지 판단한다.
- Stack 에 든 값을 초기화한 다음, StreamReader로 입력값을 받아 input 에 담고 Stack에 '(' 가 없을 때 ')' 가 나왔는지 확인하기 위한 bool 값 needCheck 를 true로 초기화한다.
- foreach 문을 통해 입력받은 input 의 괄호를 순회하며 '(' 라면 괄호를 Push 하여 Stack 에 담고 continue 한다. ')' 라면 Stack의 개수를 파악하여 0개라면 needCheck 를 false로 초기화하고 break, 아니라면 Pop 하여 Stack에 있는 '(' 를 뺀다.
- foreach 문이 끝났을 때 삼항연산자를 통해 needCheck 가 true이고 Stack의 개수가 0이라면 "YES"를, 아니라면 "NO"를 StringBuilder에 담는다.
- StreamWriter로 StringBuilder에 담은 값을 출력한다.
정답 코드
using System.IO;
using System.Text;
class Backjoon
{
static void Main(string[] args)
{
using var sr = new StreamReader(Console.OpenStandardInput());
using var sw = new StreamWriter(Console.OpenStandardOutput());
StringBuilder sb = new StringBuilder();
int t = int.Parse(sr.ReadLine());
Stack<char> stack = new Stack<char>();
for (int i = 0; i < t; i++)
{
stack.Clear();
string input = sr.ReadLine();
bool needCheck = true;
foreach (char c in input)
{
if (c == '(')
{
stack.Push(c);
continue;
}
if (stack.Count == 0)
{
needCheck = false;
break;
}
stack.Pop();
}
sb.AppendLine(needCheck && stack.Count == 0 ? "YES" : "NO");
}
sw.Write(sb.ToString());
}
}'Development > Baekjoon' 카테고리의 다른 글
| [C#] 12789번: 도키도키 간식드리미 (0) | 2025.11.18 |
|---|---|
| [C#] 4949번: 균형잡힌 세상 (0) | 2025.11.17 |
| [C#] 10773번: 제로 (0) | 2025.11.15 |
| [C#] 28278번: 스택 2 (0) | 2025.11.14 |
| [C#] 13909번: 창문 닫기 (0) | 2025.11.13 |