스택과 관련된 문제
[문제]
괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고 부른다. 한 쌍의 괄호 기호로 된 “( )” 문자열은 기본 VPS 이라고 부른다. 만일 x 가 VPS 라면 이것을 하나의 괄호에 넣은 새로운 문자열 “(x)”도 VPS 가 된다. 그리고 두 VPS x 와 y를 접합(concatenation)시킨 새로운 문자열 xy도 VPS 가 된다. 예를 들어 “(())()”와 “((()))” 는 VPS 이지만 “(()(”, “(())()))” , 그리고 “(()” 는 모두 VPS 가 아닌 문자열이다.
여러분은 입력으로 주어진 괄호 문자열이 VPS 인지 아닌지를 판단해서 그 결과를 YES 와 NO 로 나타내어야 한다.
[입력]
입력 데이터는 표준 입력을 사용한다. 입력은 T개의 테스트 데이터로 주어진다. 입력의 첫 번째 줄에는 입력 데이터의 수를 나타내는 정수 T가 주어진다. 각 테스트 데이터의 첫째 줄에는 괄호 문자열이 한 줄에 주어진다. 하나의 괄호 문자열의 길이는 2 이상 50 이하이다.
[출력]
출력은 표준 출력을 사용한다. 만일 입력 괄호 문자열이 올바른 괄호 문자열(VPS)이면 “YES”, 아니면 “NO”를 한 줄에 하나씩 차례대로 출력해야 한다.
[나의 풀이] (스택 이용 안함)
#include <iostream>
#include <string>
using namespace std;
int main()
{
int num;
cin>>num;
string vps;
for(int i=0; i<num; i++)
{
int pair=0;
cin>>vps;
for(int j=0; j<vps.length(); j++)
{
if(vps[j]=='(')
{
pair++;
}
else
{
pair--;
}
if(pair<0) // ) 괄호로 이미 글러먹은 경우
{
cout<<"NO"<<endl;
break;
}
}
if(pair>0) // ( 괄호가 남은 경우
{
cout<<"NO"<<endl;
}
if(pair==0) // vps인 경우
{
cout<<"YES"<<endl;
}
}
}
내가 스택 문제임을 알고도 그리고 설계도 스택으로 했음에 불구하고 스택으로 코드를 짜지 않은건 "스택이 빈 상황에 ) 괄호가 들어오면 어떡하지?" 라는 걱정 때문이었다 하지만 이것은 아래 코드로 해결할수 있다!
else if (bracket[j] == ')')
{ // 닫는 괄호일때,
if (!s.empty())
{ // 스택이 비어있지 않으면,
s.pop();
}
else
{ // 비어있으면
result = "NO";
}
}
이런식으로 비어 있는데 ) 괄호가 온 경우와 그냥 온 경우를 나눌수 있다
[남이 짠 코드]
#include <iostream>
#include <stack>
using namespace std;
int main()
{
string bracket; // 입력될 문자열
int T; // 입력 데이터의 수
int bracket_size = 0;
string result;
cin >> T;
for (int i = 0; i < T; i++)
{
stack<char> s; // i가 달라질때마다 스택은 초기화되어야함
result = "YES"; // result 값은 YES로 초기화
cin >> bracket;
bracket_size = bracket.size(); // 문자열의 처음부터 탐색 시작
for (int j = 0; j < bracket_size; j++)
{
if (bracket[j] == '(')
{ // 여는 괄호일때
s.push('(');
}
else if (bracket[j] == ')')
{ // 닫는 괄호일때,
if (!s.empty())
{ // 스택이 비어있지 않으면,
s.pop();
}
else
{ // 비어있으면
result = "NO";
}
}
} // 마지막까지 연산완료 후, // 여는 괄호와 닫는 괄호의 짝이 맞지 않는 경우
// 즉, 스택이 비어있지 않은 경우
if (!s.empty())
{
result = "NO";
}
cout << result << endl;
}
return 0;
}
출처: https://beginnerdeveloper-lit.tistory.com/54 [초보 개발자의 이야기, 릿허브]
[결론]
설계는 잘했으나 구현이 약했음
'PS 연습' 카테고리의 다른 글
[자료구조] 백준 문제 풀이 - 1158 요세푸스 문제 (0) | 2022.04.10 |
---|---|
[자료구조] 백준 문제 풀이 - 1406 에디터 (0) | 2022.04.09 |
[자료구조] 백준 문제 풀이 - 10799 쇠막대 (0) | 2022.04.08 |
[자료구조] 백준 문제 풀이 - 1874 스택수열 (0) | 2022.04.05 |
[자료구조] 백준 문제 풀이 - 2605 줄 세우기 (0) | 2022.04.02 |
스택과 관련된 문제
[문제]
괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고 부른다. 한 쌍의 괄호 기호로 된 “( )” 문자열은 기본 VPS 이라고 부른다. 만일 x 가 VPS 라면 이것을 하나의 괄호에 넣은 새로운 문자열 “(x)”도 VPS 가 된다. 그리고 두 VPS x 와 y를 접합(concatenation)시킨 새로운 문자열 xy도 VPS 가 된다. 예를 들어 “(())()”와 “((()))” 는 VPS 이지만 “(()(”, “(())()))” , 그리고 “(()” 는 모두 VPS 가 아닌 문자열이다.
여러분은 입력으로 주어진 괄호 문자열이 VPS 인지 아닌지를 판단해서 그 결과를 YES 와 NO 로 나타내어야 한다.
[입력]
입력 데이터는 표준 입력을 사용한다. 입력은 T개의 테스트 데이터로 주어진다. 입력의 첫 번째 줄에는 입력 데이터의 수를 나타내는 정수 T가 주어진다. 각 테스트 데이터의 첫째 줄에는 괄호 문자열이 한 줄에 주어진다. 하나의 괄호 문자열의 길이는 2 이상 50 이하이다.
[출력]
출력은 표준 출력을 사용한다. 만일 입력 괄호 문자열이 올바른 괄호 문자열(VPS)이면 “YES”, 아니면 “NO”를 한 줄에 하나씩 차례대로 출력해야 한다.
[나의 풀이] (스택 이용 안함)
#include <iostream>
#include <string>
using namespace std;
int main()
{
int num;
cin>>num;
string vps;
for(int i=0; i<num; i++)
{
int pair=0;
cin>>vps;
for(int j=0; j<vps.length(); j++)
{
if(vps[j]=='(')
{
pair++;
}
else
{
pair--;
}
if(pair<0) // ) 괄호로 이미 글러먹은 경우
{
cout<<"NO"<<endl;
break;
}
}
if(pair>0) // ( 괄호가 남은 경우
{
cout<<"NO"<<endl;
}
if(pair==0) // vps인 경우
{
cout<<"YES"<<endl;
}
}
}
내가 스택 문제임을 알고도 그리고 설계도 스택으로 했음에 불구하고 스택으로 코드를 짜지 않은건 "스택이 빈 상황에 ) 괄호가 들어오면 어떡하지?" 라는 걱정 때문이었다 하지만 이것은 아래 코드로 해결할수 있다!
else if (bracket[j] == ')')
{ // 닫는 괄호일때,
if (!s.empty())
{ // 스택이 비어있지 않으면,
s.pop();
}
else
{ // 비어있으면
result = "NO";
}
}
이런식으로 비어 있는데 ) 괄호가 온 경우와 그냥 온 경우를 나눌수 있다
[남이 짠 코드]
#include <iostream>
#include <stack>
using namespace std;
int main()
{
string bracket; // 입력될 문자열
int T; // 입력 데이터의 수
int bracket_size = 0;
string result;
cin >> T;
for (int i = 0; i < T; i++)
{
stack<char> s; // i가 달라질때마다 스택은 초기화되어야함
result = "YES"; // result 값은 YES로 초기화
cin >> bracket;
bracket_size = bracket.size(); // 문자열의 처음부터 탐색 시작
for (int j = 0; j < bracket_size; j++)
{
if (bracket[j] == '(')
{ // 여는 괄호일때
s.push('(');
}
else if (bracket[j] == ')')
{ // 닫는 괄호일때,
if (!s.empty())
{ // 스택이 비어있지 않으면,
s.pop();
}
else
{ // 비어있으면
result = "NO";
}
}
} // 마지막까지 연산완료 후, // 여는 괄호와 닫는 괄호의 짝이 맞지 않는 경우
// 즉, 스택이 비어있지 않은 경우
if (!s.empty())
{
result = "NO";
}
cout << result << endl;
}
return 0;
}
출처: https://beginnerdeveloper-lit.tistory.com/54 [초보 개발자의 이야기, 릿허브]
[결론]
설계는 잘했으나 구현이 약했음
'PS 연습' 카테고리의 다른 글
[자료구조] 백준 문제 풀이 - 1158 요세푸스 문제 (0) | 2022.04.10 |
---|---|
[자료구조] 백준 문제 풀이 - 1406 에디터 (0) | 2022.04.09 |
[자료구조] 백준 문제 풀이 - 10799 쇠막대 (0) | 2022.04.08 |
[자료구조] 백준 문제 풀이 - 1874 스택수열 (0) | 2022.04.05 |
[자료구조] 백준 문제 풀이 - 2605 줄 세우기 (0) | 2022.04.02 |