본문 바로가기

알고리즘&자료구조/백준

9012 - 괄호

728x90

문제

괄호 문자열은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다.

한 쌍의 괄호 기호로 입력으로 주어진 괄호 문자열이 괄호의 모양이 바르게 구성된 올바른 괄호 문자열인지 아닌지를 판단해서 그 결과를 YES 와 NO 로 나타내어야 한다.

입력

입력의 첫 번째 줄에는 입력 데이터의 수를 나타내는 정수 T가 주어진다.

각 테스트 데이터의 첫째 줄에는 괄호 문자열이 한 줄에 주어진다.

하나의 괄호 문자열의 길이는 2 이상 50 이하이다. 

출력

만일 입력 괄호 문자열이 올바른 괄호 문자열이면 “YES”, 아니면 “NO”를 한 줄에 하나씩 차례대로 출력해야 한다. 

 

예제 입력

6
(())())
(((()())()
(()())((()))
((()()(()))(((())))()
()()()()(()()())()
(()((())()(

예제 출력

NO
NO
YES
NO
YES
NO

 


풀이

프로그래머스에도 비슷한 문제가 있다. 

그때는 아래처럼 살짝 야매식으로 풀었는데 통과가 됐었다. 

def solution(s):
    if s[0] == ")":
        answer = "NO"
    elif s[-1] == "(":
        answer = "NO"
    elif s[-3:] == "(()":
        answer = "NO"
    elif s[:2] == "())":
        answer = "NO"
    elif s.count("(") != s.count(")"):
        answer = "NO"
    else:
        answer = "YES"

    return print(answer)

T = int(input())

for _ in range(T):
    solution(input())

별다른 로직이 있는건 아니고 시작부터 틀린 것 혹은 마지막이 잘못된 것 인지 아닌지를 판별하고 또 짝이 다 맞는지 갯수 확인만 하는 방법이었는데 백준에서는 통하지 않았다 ㅋㅋ 

 

결국 반복문을 통해서 괄호들을 제거해주는 방식으로 문제를 풀어야겠다는 생각이 들긴 했는데 while문보단 for문이 익숙한지라 for문만으로 해결해보려고 여러차례 시도했지만 실패했다.

 

def remove(t1):
  a = []
  for i in range(len(t1)):
    try:
      if i == 0:
        a.append(t1[i])
      else:
        if t1[i-1] == "(" and t1[i] == ")":
          a.pop()
        else:
          a.append(t1[i])
    except:
      pass
  t1 = a
  return t1

T = int(input())
for _ in range(T):
    t2 = input()
    while len(t2) > 0:
      first = len(t2)
      t2 = remove(t2)
      last = len(t2)
      if first == last:
        break
    if len(t2) == 0:
        print("YES")
    else:
        print("NO")

for 문을 통해서 한바퀴 돌면서 괄호를 제거해주는 함수를 정의해주고 while문으로 이 함수를 반복적으로 사용하되 만약 함수를 사용하기 전과 후의 총 글자수가 변함이 없다면 제거된 괄호가 없다는 뜻이므로 반복문이 멈추도록 조건을 주었다.

 

그렇게 정제된 문장이 괄호가 모두 제거되어 0글자면 YES를, 남은 괄호가 있다면 NO를 출력하도록 했다.

 

'알고리즘&자료구조 > 백준' 카테고리의 다른 글

9093 - 단어 뒤집기  (0) 2021.10.08