[자료구조] 백준 문제 풀이 - 9012 괄호

2022. 4. 2. 23:44· PS 연습
스택과 관련된 문제

 

[문제]

괄호 문자열(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
'PS 연습' 카테고리의 다른 글
  • [자료구조] 백준 문제 풀이 - 1406 에디터
  • [자료구조] 백준 문제 풀이 - 10799 쇠막대
  • [자료구조] 백준 문제 풀이 - 1874 스택수열
  • [자료구조] 백준 문제 풀이 - 2605 줄 세우기
생선묵김치찌개
생선묵김치찌개
생선묵김치찌개
준혁's 코딩 연구기록
생선묵김치찌개
전체
오늘
어제
  • 분류 전체보기 (96)
    • Java (5)
    • Spring Boot (3)
    • 자료구조 (8)
    • 네트워크 (4)
    • 데이터베이스 (4)
    • 기술적 고민 (17)
      • Side Match (13)
      • 자리나따 (4)
    • C++ (3)
    • Algorithm (4)
    • PS 연습 (38)
    • 잡동사니 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • open api
  • 양방향 연결 리스트
  • sentry
  • 큐
  • Stream
  • 백준 골드
  • 백준
  • 예외처리
  • 단순 연결 리스트
  • ㄱ
  • 트리
  • DN
  • 브루트 포스
  • 해커톤
  • aws rds
  • 완전탐색
  • dp
  • 원형 연결 리스트
  • 스프링
  • 재귀
  • 수식트리
  • 파일 업로드
  • 배열 리스트
  • 알고리즘
  • 열혈 자료구조
  • 자료구조
  • 스택
  • CPP
  • 이진트리
  • backend

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.1
생선묵김치찌개
[자료구조] 백준 문제 풀이 - 9012 괄호
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.