https://www.acmicpc.net/problem/9012
9012번: 괄호
괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고
www.acmicpc.net
괄호 문자열에 대한 설명을 듣고 참 거짓을 판별하면 되는 문제이다.
() 이게 기본 x면
(x)인 (()) 이것도 가능
xy인 ()() 이것도 가능 하지만 나머지는 불가
약간 프로그래밍할때 {}를 활용하는것과 비슷하다.
( 이게 생기면 똑같은 갯수의 )가 필요한 원리라고 생각하고 문제를 풀기 시작했다.
#include <iostream>
#include <string>
using namespace std;
int main() {
int T;
cin >> T;
for (int test_case = 1; test_case <= T; test_case++) {
int a = 0;
int b = 0;
string str;
cin >> str;
for (int i = 0; i < str.length();i++) {
if (str[i] == '(') {
a++;
}
else
b++;
}
if (a == b)
cout << "YES" << endl;
else
cout << "NO" << endl;
}
return 0;
}
결과는 틀림 예시를 다시 보니 ())(()처럼 두개 ( )의 짝은 맞지만 )( 이런식으로 되버리면 안된다는것을 깨닫고 코드를 다시 짜보았다.
#include <iostream>
#include <string>
#include <stack>
using namespace std;
int main() {
int T;
cin >> T;
for (int test_case = 1; test_case <= T; test_case++) {
int a = 0;
int b = 0;
string str;
string answer = "YES";
stack <char>s;
cin >> str;
for (int i = 0; i < str.length();i++) {
if (str[i] == '(') {
s.push('(');
}
if (str[i] == ')') {
if (s.empty()) {
answer = "NO";
break;
}
else {
s.pop();
}
}
}
if (!s.empty())
answer = "NO";
cout << answer << endl;
}
return 0;
}
스택을 안쓰고 그냥 연산으로만 풀려고 해서 시간이 오래걸렸다. 상황에 맞는 자료구조를 사용할 수 있도록 충분히 연습해두자.
그리고 answer을 출력하는 과정을 그냥 cout << "YES" << endl; 이런식으로 각각 써주었더니 두번 출력될 수도 있고 한번도 출력이 되지 않을 수도 있는 문제가 있었다. 그냥 변수 하나만 설정해 주면 되는것을..
변수를 많이 선언하는것에 두려워하지말자. 필요한 변수는 알아보기 쉽게 선언해주기!
'코딩테스트 > C++' 카테고리의 다른 글
[백준 C++] 1406번: 에디터 (1) | 2024.03.23 |
---|---|
[백준 C++] 1874번: 스택 수열 (1) | 2024.03.23 |
[백준 C++] 9093번: 단어 뒤집기 (0) | 2024.03.23 |
[백준 C++] 10828번: 스택 (0) | 2024.03.22 |
[백준 C++] 11399번: ATM (0) | 2024.03.22 |