티스토리 뷰

Algorithm/BOJ

[BOJ] 괄호 9012 (1.17)

Game Client Lee Hwanguk 2023. 1. 11. 17:57

https://www.acmicpc.net/problem/9012

 

9012번: 괄호

괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고

www.acmicpc.net

괄호 문자열(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”를 한 줄에 하나씩 차례대로 출력해야 한다.

(())()) (((()())() (()())((())) ((()()(()))(((())))() ()()()()(()()())() (()((())()(
NO NO YES NO YES NO

문자열(VPS)이면 “YES”, 아니면 “NO”를 한 줄에 하나씩 차례대로 출력해야 한다.

스택사용

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Study10
{
    class App
    {
        //생성자 
        public App()
        {
            string[] arr = {
                "(())())",
                "(((()())()",
                "(()())((()))",
                "((()()(()))(((())))()",
                "()()()()(()()())()",
                "(()((())()("
            };
            
            //여기서부터 코드 작성 




            //결과 출력 
            //NO
            //NO
            //YES
            //NO
            //YES
            //NO

        }
    }
}

#1

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Net.NetworkInformation;
using System.Text;
using System.Threading.Tasks;

namespace Study12
{
    class App
    {
        //생성자
        public App()
        {
            string[] arr = {
                "(())())",
                "(((()())()",
                "(()())((()))",
                "((()()(()))(((())))()",
                "()()()()(()()())()",
                "(()((())()("
            };

            //결과 출력 (for문으로 출력)
            //NO (false)
            //NO (false)
            //YES (true)
            //NO (false)
            //YES (true)
            //NO (false)

            Stack stack = new Stack();
            Stack stack0= new Stack();
            //stack.Push(arr[0]);
            //object ob1 = stack.Pop();
            //Console.WriteLine(ob1);


            //char a = '(';
            //char b = ')';
            //string arr0=arr[0];
            //Console.WriteLine(arr0);

            //string arr0=arr[0]; //false
            //string arr1 = arr[1]; //false
            //string arr2 = arr[2]; //
            //string arr3 = arr[3];   
            //string arr4 = arr[4];   
            //string arr5 = arr[5];
            
            //arr의 인덱스를 인덱스 단위로 다시 만든다?
            //

           
        }










    }
}
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Net.NetworkInformation;
using System.Text;
using System.Threading.Tasks;

namespace Study12
{
    class App
    {

        //결과 출력 (for문으로 출력)
        //NO (false)
        //NO (false)
        //YES (true)
        //NO (false)
        //YES (true)
        //NO (false)

        public App()
        {
            string[] arr = 
                {
                "(())())",
                "(((()())()",
                "(()())((()))",
                "((()()(()))(((())))()",
                "()()()()(()()())()",
                "(()((())()("
                };
            //1. string 형식 배열이니 char식의 stack을 만들고 하나씩 넣어보자

            Stack<char> stack = new Stack<char>();

            //2.foreach문으로 arr을 순회하며 (면 + ,)면 - 

            for (int i = 0; i < arr.Length; i++) //for문을 돌면서 (arr의 용량만큼)
            {
                foreach (char arr1 in arr[i]) //arr[i]번째 인덱스 확인
                {
                    if (arr1 == '(')
                    {
                        stack.Push(arr1); //만약 '(' 면 stack에 넣고
                    }

                    else if (arr1 != '(')
                    {
                        if (stack.Count > 0)
                        {
                            stack.Pop(); //아니면 뺀다}
                        } //멈추는 장치가 필요하다.

                    }


                    

                    

                }


            }





        }
    }    

}

#2 1. '('면 stack에 넣고 ')' 뺀다.

2, for문으로 [i]번째 인덱스에 접근하면서 foreach문으로 순회한다

3.만약 stack에 아무것도 없으면 종료

4.만약 stack이 비어있으면 Yes 아니면 No

 

// 1.17

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp7
{
    internal class Program
    {
        
        static void Main()
        {
            string[] arr =  {
                "(())())",
                "(((()())()",
                "(()())((()))",
                "((()()(()))(((())))()",
                "()()()()(()()())()",
                "(()((())()("
            };

            //여기서부터 코드 작성 

            //결과 출력 
            //NO
            //NO
            //YES
            //NO
            //YES
            //NO

            //1.배열의 인스턴스를 char형식으로 변환

            //for문을 돌며 if조건문을 통해 필터링
            Stack<char> stack = new Stack<char>(); //char형식의 Stack을 만들고 for문을 통해 arr의 요소를 넣어보자
            //for (int i = 0; i < arr.Length; i++)
            //{
                
            //}
            for(int i=0; i<arr.Length; i++) //일단 Char 형식의 stack에 모두 옮겨서 빼볼까
            {
                foreach(Char chr in arr[i])
                {
                    if (chr == '(') // (이면 push
                    {
                        stack.Push(chr); 
                    }
                        
                    else if (chr == ')') //) 이면 pop
                    {
                        if (stack.Count > 0) 
                        { 
                            stack.Pop(); 
                        }
                        else //stack.count<0
                        {
                            stack.Push(chr);
                            break;   
                        }
                    }

                }
                if (stack.Count == 0)
                    Console.WriteLine("YES");
                else
                    Console.WriteLine("NO");
                stack.Clear();
                Console.WriteLine();  //한줄씩 출력되게
            }

                
            
        }
    }
}

 

#Stack.Pop은 먼저 들어간 요소를 꺼낸다 (선입 선출)

#foreach문에서 한번 돌면 요소를 비워줘야 중첩이 되지않는다 

#비워주는게 생각이 안나서 오래걸렸다...

#소요시간 48분 (문제 읽기 30분 풀기 18분)

#내일모래 다시풀어보자 까먹지말자 (1.18일 다시도전)

'Algorithm > BOJ' 카테고리의 다른 글

[BOJ] 라우터 15828  (0) 2023.01.17
[BOJ] 4458 첫 글자를 대문자로  (0) 2023.01.16
[BOJ] 2711 오타맨 고창영  (0) 2023.01.16
[BOJ] 9086 문자열  (0) 2023.01.12
급식 배부  (0) 2023.01.11
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함